【发布时间】:2023-04-06 15:17:01
【问题描述】:
与单端 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;
}
【问题讨论】:
-
乍一看,我可以告诉你问题出在你的方法上。没有什么可以阻止您在有向图中执行此操作。您可以查看这篇论文 (people.eecs.berkeley.edu/~krste/papers/beamer-sc2012.pdf) 并了解他们的方法。
-
自然,向后搜索时需要反转边缘的方向。
标签: graph-theory graph-algorithm breadth-first-search