如果广度优先搜索(BFS)可以更快地执行相同的操作,为什么还要使用Dijkstra的算法?


109

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

另外,我看到Dijkstra在路由协议中的用法很像。

因此,如果BFS可以更快地完成相同的操作,为什么还要使用Dijkstra的算法呢?

Answers:


156

Dijkstra允许为每个步骤分配除1以外的距离。例如,在路由时,距离(或权重)可以通过速度,成本,首选项等进行分配。然后,该算法为您提供了从源到遍历图中每个节点的最短路径。

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


1
两者将产生相同的结果,即两个顶点之间的路径,但是只有dijkstra才能保证最短的路径。
埃德温

请参阅已接受的答案,第二条评论。解释为什么计算复杂度不同的一种非常好的方法:stackoverflow.com/questions/25449781/…–
jmcarter9t

23

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

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

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

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



4

从实现的角度来看,通过queue与交换Dijkstra的算法,可以完全像BFS一样实现priority queue

资源

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.