【问题标题】:Two sided BFS correctness双面 BFS 正确性
【发布时间】:2023-04-06 15:17:01
【问题描述】:

与单端 BFS 相比,bi-directional 搜索/两次 BFS 的查找时间更快。

双向搜索,工作原理如下

从两端执行传统的 BFS,并将访问的节点保存在 他们各自的队列。如果一个节点是公共的,在两个队列之间, 我们可以得出结论,存在一条路径。

但是,假设我被要求在下图中找到node1node2 之间的路径,该算法将报告存在路径,并且 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


【解决方案1】:

从这一行开始:

GraphNode 节点 = headQueue.poll();

您应该遍历 headQueue 中的所有节点,而不是仅轮询 headQueue 中的 1 个节点。基本上每个级别的所有节点都应该被拉出以便获得正确的级别计数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 2022-01-05
    • 2021-12-31
    • 2011-06-30
    • 1970-01-01
    相关资源
    最近更新 更多