【问题标题】:How do you use a Bidirectional BFS to find the shortest path?如何使用双向 BFS 找到最短路径?
【发布时间】:2012-06-15 06:41:13
【问题描述】:

如何使用双向 BFS 找到最短路径?假设有一个 6x6 网格。 起点在 (0,5),终点在 (4,1)。使用双向 bfs 的最短路径是什么?没有路径成本。而且它是无向的。

【问题讨论】:

    标签: algorithm path-finding shortest-path breadth-first-search bidirectional


    【解决方案1】:

    双向 BFS 是如何工作的?

    同时从源顶点和目标顶点运行两个 BFS,一旦发现两个运行共有的顶点就终止。该顶点将位于源和目标之间。

    为什么比 BFS 更好?

    在大多数情况下,双向 BFS 将产生比简单 BFS 更好的结果。假设源与目标的距离为k,分支因子为B(每个顶点平均有B条边)。

    • BFS 将遍历1 + B + B^2 + ... + B^k 顶点。
    • 双向 BFS 将遍历 2 + 2B^2 + ... + 2B^(k/2) 顶点。

    对于较大的Bk,第二个显然比第一个快得多。


    在你的情况下:

    为简单起见,我将假设矩阵中没有障碍。这是发生了什么:

    iteration 0 (init):
    front1 = { (0,5) }
    front2 = { (4,1) }
    
    iteration 1: 
    front1 = { (0,4), (1,5) }
    front2 = { (4,0), (4,2), (3,1), (5,1) }
    
    iteration 2:
    front1 = { (0,3), (1,4), (2,5) }
    front2 = { (3,0), (5,0), (4,3), (5,2), (3,2), (2,1) }
    
    iteration 3:
    front1 = { (0,2), (1,3), (2,4), (3,5) }
    front2 = { (2,0), (4,4), (3,3), (5,3), (2,2), (1,1), }
    
    iteration 4:
    front1 = { (0,1), (1,2), .... }
    front2 = { (1,2) , .... }
    

    现在,我们发现前沿在 (1,2) 处相交,以及从源顶点和目标顶点到达那里的路径:

    path1: (0,5) -> (0,4) -> (0,3) -> (0,2) -> (1,2)
    path2: (4,1) -> (3,1) -> (2,1) -> (1,1) -> (1,2)
    

    我们现在只需要反转路径 2 并将其附加到路径 1(当然要删除一个常见的相交顶点),从而为我们提供完整的路径:

    (0,5) -> (0,4) -> (0,3) -> (0,2) -> (1,2) -> (1,1) -> (2,1) -> (3,1) -> (4,1)
    

    【讨论】:

    • 很好的解释。想知道如何存储所有路径以便在队列之间存在交叉点时进行追溯?如果我们存储所有路径,每个节点会占用大量空间。
    • @newbie_old Similar to regular BFS,你发现的每个节点,你标记你如何发现它。 (在双向 BFS 中特别注意应该有两个父节点的相交节点)。然后,您从节点返回直到根。空间需求与顶点数量呈线性关系,这无论如何都是 BFS 所需的空间(对于visited 集合和队列)。
    • 所以时间复杂度降低了平方根;而空间复杂度是一样的?
    • @user815408 在渐近符号中,是的。 (例如,所需的空间增加了一倍,但这是相同的渐近复杂度)。
    • @amit 我想知道为什么它的时间比通常的 BFS 更好?我们必须在每次出队操作(即每个新级别)后检查整个“已访问”数组是否有交集,并且由于我们在双向 BFS 中处理 d/2 个级别,我们将进行 V×(d/2) 比较总共,这里的 V 至少与 b^d 一样多。那有什么意义呢?有人能解释一下我可能错在哪里吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多