Networking 贝尔曼·福特和迪克斯特拉的区别';s算法

Networking 贝尔曼·福特和迪克斯特拉的区别';s算法,networking,graph-algorithm,Networking,Graph Algorithm,好的,这是图表。我的源节点是1,目标节点是5 我的问题是 两种算法的输出是否相同? 也就是说,两者都将返回1->2->4->5?(dijkstra不允许负重) 提前感谢您的帮助。Bellman-Ford算法是一种单源最短路径算法,它允许负边权重,并可以检测图形中的负循环 Dijkstra算法也是另一种单源最短路径算法。但是,所有边的权重必须为非负 对于您的情况,就总成本而言,不会有任何差异,因为图中的边具有非负权重。然而,通常使用Dijkstra算法,因为二进制堆的典型实现具有Theta((|E

好的,这是图表。我的源节点是
1
,目标节点是
5

我的问题是

两种算法的输出是否相同? 也就是说,两者都将返回
1->2->4->5
?(dijkstra不允许负重)


提前感谢您的帮助。

Bellman-Ford算法是一种单源最短路径算法,它允许负边权重,并可以检测图形中的负循环

Dijkstra算法也是另一种单源最短路径算法。但是,所有边的权重必须为非负

对于您的情况,就总成本而言,不会有任何差异,因为图中的边具有非负权重。然而,通常使用Dijkstra算法,因为二进制堆的典型实现具有
Theta((|E |+|V |)log | V |)的时间复杂度
,而Bellman Ford算法具有
O(|V | E |)的时间复杂度


如果有多条路径具有最小成本,则返回的实际路径取决于实现(即使对于相同的算法也是如此)。

Dijkstra算法中的顶点包含网络的全部信息。不存在每个顶点只关心自己和它的邻居的情况。另一方面,Bellman-Ford算法的节点仅包含与之相关的信息。该信息允许该节点相互了解可以连接的邻居节点和关系来自的节点。Dijkstra算法比Bellman-Ford算法更快,但是第二种算法对于解决一些问题更有用,例如路径的负权重。

Djikstra算法是一种贪婪技术,对于Bellman-Ford算法的实现,我们需要动态方法

在djikstra算法中,我们在一个循环中对每个节点/顶点进行松弛,而在bellmanford算法中,我们只执行| v-1 |次松弛

Dijkstra算法适用于边权重为正的图,在负边图的情况下失败,因为bellmanford算法比djikstra算法具有优势,即使边的权重为负,它也可以实现

bellmanford可以发现图解是否存在(即给定的有向图是否有负权环),而djikstra算法无法做到这一点


当用线性阵列实现时,djikstra算法的时间复杂度为O(v^2);当用二进制堆或斐波那契堆实现时,时间复杂度为O(e.log v),其中bellmanford算法的时间复杂度为O(| v | | e |)。我想补充一点,对于分布式节点网络,Dijkstra算法需要集中控制(你需要一个全局开放列表,等等),而贝尔曼·福特(Bellman Ford)没有(每个节点只更新变化的邻居)。它们在网络行话中分别称为链接状态和距离向量算法。[我希望这不是太模糊以至于无法理解…]
   2           1
1----------2---------4
|          |         |
|3         |3        |1
|    6     |         |
3---------5 ---------