Bidirectional Breadth Search - 双向广度搜索


问题

的二维方格图中用双向广度搜索从点移动到点。

解法

双向广度优先搜索是在广度优先搜索基础上的一个变种,搜索速度更快。该算法从两个点开始,同时进行广度优先搜索,两边的点在某一处相遇,即可得到一条从的路径。

初始时将分别加入两个队列中。每次分别从队列中取出节点进行访问,在节点加入之前将其染成红色,加入之前其染成蓝色。若取出后发现已被染成蓝色,说明访问过,或取出后发现其已被染成红色,说明访问过。说明两个队列在此处相遇,算法结束。

的二维方格中,从移动到的过程如下:

BidirectionalBreadthSearch1.png

初始时,将染红并加入中,将染蓝并加入

BidirectionalBreadthSearch2.png

中取出头节点,将其四周未被染色的邻节点染红并加入中。从中取出头节点,将其四周未被染色的邻节点染蓝并加入中;

BidirectionalBreadthSearch3.png

中取出头节点,将其四周未被染色的邻节点染红并加入中。从中取出头节点,将其四周未被染色的邻节点染蓝并加入中;

BidirectionalBreadthSearch7.png

中取出头节点,其邻节点已经被染蓝(已经被访问过)。因此相遇的位置,算法结束;

对于二维方格,广度优先搜索从点遍历到点的过程一般是从向四周发散开,一直到达点。而双向广度优先搜索则是从两个点分别发散开,在中间相遇。

BidirectionalBreadthSearch8.png

双向广度搜索的时间复杂度与广度优先搜索一样,也是


源码

BidirectionalBreadthSearch.h

BidirectionalBreadthSearch.cpp

测试

BidirectionalBreadthSearchTest.cpp