如果广度优先搜索(BFS)可以更快地做同样的事情,为什么要使用Dijkstra的算法?

时间:2010-09-29 00:56:23

标签: algorithm graph dijkstra breadth-first-search

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

另外,我见过Dijkstra在路由协议中使用的很多。

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

5 个答案:

答案 0 :(得分:133)

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

与此同时,BFS基本上只是在每次迭代时通过一个“步骤”(链接,边缘,无论你想在应用程序中调用它)扩展搜索,这恰好具有找到最小步数的效果从源(“root”)到达任何给定节点。

答案 1 :(得分:20)

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

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

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

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

答案 2 :(得分:2)

Dijkstra的算法

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

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

答案 3 :(得分:2)

对此有一个困惑,可以使用改进的 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))

答案 4 :(得分:0)

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

来源:enter link description here