我们知道,BFS是往广处去搜索,我们把这想象成一个以起点为圆心的一个圆,每向前走一步,就是圆的半径增大一个单位,而圆的每个单位面积上是一种状态,当圆增大到目标点那么大时,找到了答案,搜索结束。那么显然的,当半径较大时,每走一步就会有十分大量的状态需要来储存( S=πr² )。通常的,我们用“判重”的方法来解决,但是在这里,还有一种优化方法:双向搜索。
双向搜索适用于起点和终点状态都很明确的搜索题。试想,我从起点推算到终点,与我从终点推算到起点,最后得到的最少步骤数一定是相等的,所以我们可以从起点和终点同时搜索。同样用圆来打比方,假设以起点为圆心画圆时,最终半径为r,以终点为圆心画圆时,最终半径为R。那么显然有:
πr²+πR²≤π(r+R)²
所以当害怕BFS会TLE时,不妨打一打双向BFS。