双向BFS可以极大地减少扩展节点个数,不是从o(n)到o(n/2)而通常是o(n)到o(sqrt(n))(考虑正反向搜索树都是完全k叉树的情况).
单向BFS求出的一般是最短的路径,双向BFS求出的路径不一定是最短的,最短是有条件的。双向BFS求出的路径是最短的充要条件是不存在状态图中不存在长度为奇数的回路(双向BFS的两个队列都只有两层,画图分析可得出结论),对于一般的位置移动的状态变化(如限制只能上下左右邻近位置的移动)通常是不存在奇数长度的回路,此时双向BFS求出的路径一定是最短的。
有些时候两个方向的搜索树结构差异很大,如正向的可能是一个完全k叉树,反向的却退化成了链表,但不搜索是不知道的,如果我们一开始就知道,大可选择个层数多、节点少的方向进行搜索。一个好的搜索策略能在事先不了解两边的搜索树结构情况下对节点个数进行折中,使它不至于太大。
通常我们会在每次循环中选择节点个数较少的那个队列进行扩展,这样由于最后两个队列的节点个数相同(只是一边比另一边最多多k个),所以最坏情况下扩展的节点个数不过是正向反向搜索树节点个数最小的两倍。
如果不做这种优化,每次循环中都扩展两个队列,则两个队列中非叶子节点个数相同,最坏情况是两边搜索树节点个数最小的k倍左右。
最糟糕的是控制层数平衡进行扩展(考虑正向搜索树是k叉树,反向搜索树退化为链表)。它的上界是通过最坏搜索树来计算的,而前面两种都是根据最好搜索树来计算。