经过大量谷歌搜索后,我发现大多数消息来源称Dijkstra算法比Bellman-Ford算法“更有效”。但在什么情况下Bellman-Ford算法比Dijkstra算法更好?
我知道“更好”是一个广泛的陈述,所以具体来说,我的意思是速度和空间,如果适用的话。当然,在某种情况下,贝尔曼 - 福特方法比Dijkstra方法更好。
答案 0 :(得分:40)
Bellman-Ford算法是一种单源最短路径算法,因此当你有负边缘权重时,它可以检测图中的负循环。
两者之间的唯一区别是Bellman Ford也能够处理负权重,而Dijkstra算法只能处理正数。
来自wiki
然而,在没有负权重边缘的情况下,Dijkstra通常被认为是更好的,因为典型的二进制堆优先级队列实现具有O((| E | + | V |)log | V |)时间复杂度[Fibonacci堆优先级队列给出O(| V | log | V | + | E |)],而Bellman-Ford算法有O(| V || E |)复杂度然而,Dijkstra的算法贪婪地选择最小权重节点 尚未处理的,并执行此放松过程 在它的所有外围边缘;相比之下,贝尔曼 - 福特算法 简单地放松所有的边缘,并做这| V | - 1次,其中| V | 是图中顶点的数量。在每次重复中, 正确计算距离的顶点数量增加了 因此,最终所有顶点都将正确 距离。 此方法允许应用Bellman-Ford算法 比Dijkstra更广泛的投入。
答案 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)。
答案 5 :(得分:-6)
我不完全同意,差异在于实现和复杂性,Dijsktra的算法更快(O(n ^ 2))但难以实现,而Bellman Ford复杂度为O(n ^ 3)但更容易实现。