与单端BFS相比,bi-directional搜索/两说BFS的查找时间更快。
双向搜索,如下工作
从两端执行传统BFS,并将受访节点保存在 他们各自的队列。如果一个节点很常见,则在两个队列之间, 我们可以得出结论,存在一条路径。
但是,我要求在下图中找到node1
和node2
之间的路径,此算法会报告路径存在,1表示节点之间的距离,因为node3对两个队列都是通用的。
node1 -> node3 <- node2
然而,事实并非如此,结果不正确。双向搜索是否适用于有向图,或者是否需要对我的方法进行更改?
这是我的代码
public int searchDoubleEndedBfs( GraphNode node1, GraphNode node2 )
{
Queue<GraphNode> headQueue = new LinkedList<>();
Set<GraphNode> visited = new HashSet<>();
Queue<GraphNode> tailQueue = new LinkedList<>();
Queue<GraphNode> childQueue = new LinkedList<>();
int count = 0;
headQueue.add(node1);
visited.add(node1);
tailQueue.add(node2);
visited.add(node2);
while(headQueue.size() > 0 && tailQueue.size() > 0)
{
if(headQueue.size() > tailQueue.size())
{
Queue<GraphNode> temp = new LinkedList<>();
temp = headQueue;
headQueue = tailQueue;
tailQueue = temp;
}
GraphNode node = headQueue.poll();
for(int i = 0;i<node.neighbors.size();i++)
{
GraphNode neighbor = node.neighbors.get(i);
if(tailQueue.contains(neighbor))
return count+1;
if(!visited.contains(neighbor))
{
childQueue.add(neighbor);
visited.add(neighbor);
}
}
headQueue.addAll(childQueue);
childQueue.clear();
count++;
}
return -1;
}
答案 0 :(得分:0)
从这一行开始:
GraphNode node = headQueue.poll();
您应该遍历headQueue中的所有节点,而不是仅仅从headQueue中轮询1个节点。基本上每个级别的所有节点都应该被拉出以便具有正确的级别计数。