本文介绍双向搜索算法.
1.Bidrectional search
双向搜索是找源结点和目标结点间最短路径的图搜索算法. 它同时进行两个搜索 :
- 前向搜索 : 从 源结点 到 目标结点 的搜索.
- 后向搜索 : 从 目标结点 向 源结点 搜索.
前向搜索和后向搜索会分别构造两颗树, 当两颗树的结点相遇时就会终止搜索. 或者, 当一侧的优先队列为空了, 搜索失败.
使用 Bidrectional search 可以缩短搜索的时间. 比如 : 对于一颗分支为 $b$ 的树, 从 源结点 到 目标结点 的距离为 $d$, 则通过 BFS/DFS 搜索的时间复杂度为 $O(b^d)$ . 如果使用 Bidrectional search 则 前向搜索 和 后向搜索 的时间复杂度分别为 $O(b^{d/2})$ , 总的时间复杂度则为 $O(b^{d/2} + b^{d/2})$ , 远比 $O(b^d)$ 小的多.
Bidrectional search的一个难点是如何保证前向搜索和后向搜索一定会相遇。 我们可知,对于广度优先搜索,一定是可以相遇的,那么对于其它搜索算法比如A*呢?(一些研究者在者方面做研究, 提高相遇的概率, 水平有限不在这里叙述)
leetcode上的126.Word Ladder II 就需要用双端breadth-first search来求解, 才能保证不出现TLE.
1 | class Solution { |