Bellman-Ford vs Dijkstra:在什么情况下Bellman-Ford更好?

时间:2013-10-20 20:13:36

标签: algorithm dijkstra shortest-path bellman-ford

经过大量谷歌搜索后,我发现大多数消息来源称Dijkstra算法比Bellman-Ford算法“更有效”。但在什么情况下Bellman-Ford算法比Dijkstra算法更好?

我知道“更好”是一个广泛的陈述,所以具体来说,我的意思是速度和空间,如果适用的话。当然,在某种情况下,贝尔曼 - 福特方法比Dijkstra方法更好。

6 个答案:

答案 0 :(得分:40)

Bellman-Ford算法是一种单源最短路径算法,因此当你有负边缘权重时,它可以检测图中的负循环。

两者之间的唯一区别是Bellman Ford也能够处理负权重,而Dijkstra算法只能处理正数。

来自wiki

  

然而,Dijkstra的算法贪婪地选择最小权重节点   尚未处理的,并执行此放松过程   在它的所有外围边缘;相比之下,贝尔曼 - 福特算法   简单地放松所有的边缘,并做这| V | - 1次,其中| V |   是图中顶点的数量。在每次重复中,   正确计算距离的顶点数量增加了   因此,最终所有顶点都将正确   距离。 此方法允许应用Bellman-Ford算法   比Dijkstra更广泛的投入。

然而,在没有负权重边缘的情况下,Dijkstra通常被认为是更好的,因为典型的二进制堆优先级队列实现具有O((| E | + | V |)log | V |)时间复杂度[Fibonacci堆优先级队列给出O(| V | log | V | + | E |)],而Bellman-Ford算法有O(| V || E |)复杂度

答案 1 :(得分:4)

唯一的区别是Dijkstra的算法无法处理Bellman-ford处理的负边缘权重.Bandman-ford也告诉我们图形是否包含负循环。  如果图形不包含负边缘,那么Dijkstra总是更好。

Bellman-ford的有效替代方案是使用拓扑排序的有向无环图(DAG)。

http://www.geeksforgeeks.org/shortest-path-for-directed-acyclic-graphs/

答案 2 :(得分:2)

正如在所选答案中已经说明的那样,Bellman-Ford对所有顶点进行检查,Dijkstra仅对目前为止计算出的最佳距离进行检查。再次已经注意到,这改善了Dijkstra方法的复杂性,但是它需要比较所有节点以找出最小距离值。由于这在Bellman-Ford中不是必需的,因此在分布式环境中实施起来更容易。这就是为什么它被用在距离矢量路由协议(例如,RIP和IGRP)中,其中主要使用本地信息。相反,要在路由协议中使用Dijkstra,首先必须分发整个拓扑,这就是链路状态协议(如OSPF和ISIS)中发生的情况。

答案 3 :(得分:0)

Dijkstra Algo
Dijkstra algo无法区分 负边缘权重周期 是否存在于图表中

<强> 1。正边权重: - Dijkstra 始终 通过如果图表中的所有边权重均为正 的 2。负边重量。并且没有-ve edge wt。循环: - Dijkstra 总是 PASS 即使我们有一些边缘权重为负值但是图形中没有循环/循环具有负边缘权重。
    [即没有负边缘重量循环]
第3。负边重量。和-ve edge wt。周期: - Dijkstra 可能 PASS / FAIL ,即使我们有一些边缘权重为负数,并且图表中的周期/循环具有负边缘权重。

答案 4 :(得分:0)

我知道其中有4个主要区别: 1.在使用maxheap的情况下,贝尔曼时间复杂度为O(VE),Dijkstra Algo为O(ElogV)。

  1. 贝尔曼(Bellman)放松n-1次,迪杰斯特拉(Dijkstra Algo)仅放松1次。
  2. 贝尔曼可以减轻负重,但迪克斯特拉·阿尔戈(Dijkstra Algo)无法解决。
  3. 贝尔曼再一次访问一个顶点,但Dijkstra Algo仅访问一次。

答案 5 :(得分:-6)

我不完全同意,差异在于实现和复杂性,Dijsktra的算法更快(O(n ^ 2))但难以实现,而Bellman Ford复杂度为O(n ^ 3)但更容易实现。