【问题标题】:Why use Dijkstra's Algorithm if Breadth First Search (BFS) can do the same thing faster?如果广度优先搜索 (BFS) 可以更快地完成同样的事情,为什么还要使用 Dijkstra 算法?
【发布时间】:2011-04-18 14:23:31
【问题描述】:

两者都可用于从单一来源中找到最短路径。 BFS 运行在 O(E+V),而 Dijkstra 运行在 O((V+E)*log(V))

另外,我看到 Dijkstra 在路由协议中的使用非常相似。

那么,如果 BFS 可以更快地做同样的事情,为什么还要使用 Dijkstra 算法呢?

【问题讨论】:

    标签: algorithm graph dijkstra breadth-first-search


    【解决方案1】:

    Dijkstra 允许为每一步指定非 1 的距离。例如,在路由中,距离(或权重)可以通过速度、成本、偏好等来分配。然后,该算法会为您提供从源到遍历图中每个节点的最短路径。

    同时,BFS 基本上只是在每次迭代时将搜索扩展一个“步”(链接、边缘,无论您想在应用程序中调用什么),这恰好具有找到最小步数的效果 需要从您的源(“根”)到达任何给定节点。

    【讨论】:

    • 两者都会产生相同的结果,即两个顶点之间的路径,但只有 dijkstra 会保证最短路径。
    • @jmcarter9t 顺便说一句,您的评论似乎是已接受答案的第二条评论。但我假设你的意思是this comment
    • @eis 感谢您的更正。应该是此链接答案中已接受答案的第二条评论:stackoverflow.com/questions/25449781/…
    【解决方案2】:

    如果您考虑旅游网站,由于节点上的权重(距离),这些网站使用 Dijkstra 算法。

    如果你会考虑所有节点之间的距离相同,那么 BFS 是更好的选择。

    例如,考虑A -> (B, C) -> (F) 的边权重为A->B = 10、A->C = 20、B->F = C->F = 5。

    在这里,如果我们应用 BFS,答案将是 ABF 或 ACF,因为两者都是最短路径(相对于边的数量),但如果我们应用 Dijstra 的,答案将是 ABF,因为它考虑了权重在连接的路径上。

    【讨论】:

      【解决方案3】:

      Dijkstra 算法

      • 类似于加权图的 BFS。
      • 如果所有成本都相等,Dijkstra = BFS

      来源:https://cs.stanford.edu/people/abisee/gs.pdf

      【讨论】:

        【解决方案4】:

        从实现的角度来看,通过将queuepriority queue 交换,Dijkstra 的算法可以像 BFS 一样实现。

        Source

        【讨论】:

        • 这是真的吗?如果路径的成本较小,Dijkstra 会重新访问节点。 BFS 不会重新访问节点。所以从技术上讲,它与交换队列和优先队列的唯一区别并不完全相同。
        • 这不是真的,实现完全不同。 Dijkstra 从完全初始化的优先级队列开始,除了起始节点之外,所有顶点的距离都等于无穷大。 BFS 从包含起始节点的队列开始。
        【解决方案5】:

        对此有一个困惑,可以使用修改后的 BFS 算法在加权有向图中找到最短路径:

        1. 使用优先队列而不是普通队列
        2. 不跟踪访问过的节点,而是跟踪与起始节点的距离

        因为 2,一些节点会被访问不止一次,这使得它与 Dijkstra 相比效率较低。

        shortest = sys.maxsize
        
        queue = [(0, src, 0)]
        while queue:
            (cost, node, hops) = heapq.heappop(queue)
            if node == dst:
                shortest = min(distance, cheapest)
            for (node_to, node_distance) in edges[node]:
                heapq.heappush(queue, (cost + node_distance, node_to, hops + 1))
        

        【讨论】:

          【解决方案6】:
          • BFS 仅在您将最短路径计为步数边缘时有效,或者任何应用程序为所有边缘分配相同(但为正)的权重。
          • BFS 和 Dijkstra 的区别只是将 FIFO 队列替换为优先级队列!

          请注意,这并不能修复边缘的正权重约束,这是一个著名的 Dijkstra(和 BFS)缺点,Bellman-Ford 通过支付速度惩罚来解决

          来源:Erickson, Jeff (2019) 中的第 8.4、8.6 章。算法

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-02-16
            • 1970-01-01
            • 2010-12-17
            • 1970-01-01
            • 2023-04-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多