我对Floyd-Warshall,Dijkstra和Bellman-Ford算法之间的区别是否正确?


16

我一直在研究这三个,并在下面说明了他们的推论。有人可以告诉我我是否足够正确地理解它们?谢谢。

  1. Dijkstra算法仅在您只有一个来源并且想知道从一个节点到另一个节点的最小路径时使用,但是在这种情况下会失败。

  2. 当所有节点中的任何一个都可以作为源时,将使用Floyd-Warshall算法,因此您希望从任何源节点到任何目标节点的距离最短。这仅在存在负循环时失败。

  3. 如果只有一个来源,则像Dijkstra一样使用Bellman-Ford。这可以处理负重,其工作原理与弗洛伊德·沃歇尔相同,除了一个来源,对吗?(这是我最不确定的那个。)


欢迎!我编辑了多余的代码部分;人们可以自己点击进入Wikipedia,也可以在自己喜欢的教科书中查看算法。请注意,您的问题是一个奇怪的问题,因为“是”的答案只能包含其他内容。
拉斐尔

Answers:


23

Dijkstra的算法仅在您只有一个来源并且想知道从一个节点到另一个节点的最小路径时使用,但是失败[在具有负边的图中]

Dijkstra的算法是单源最短路径SSSP算法的一个示例。每种SSSP算法都会计算从选定源节点到图中每个其他节点的最短路径距离。而且,它以根树的形式计算从s到其他节点的所有最短路径的紧凑表示。在Wikipedia代码中,是此树中v的父级。ssprevious[v]v

Dijkstra算法在具有负边的图中的行为取决于所讨论的精确变体。该算法的某些变体(例如Wikipedia中的变体)始终运行很快,但在存在负边缘时无法正确计算最短路径。其他变体(如本讲义中的变体)始终正确计算最短路径(除非从源可到达负循环),但如果存在负沿,则在最坏情况下可能需要指数时间。

当所有节点中的任何一个都可以作为源时,将使用Floyd-Warshall算法,因此您希望从任何源节点到任何目标节点的距离最短。这仅在存在负循环时失败。

没错 Floyd-Warshall是全对最短路径算法的一个示例,这意味着它计算了对节点之间的最短路径。另一个示例是“对于每个节点v,以v作为源节点运行Dijkstra”。还有其他几个。

当只有一个来源时,使用Bellman-Ford就像Dijkstra一样。这可以处理负重,并且其工作原理与弗洛伊德·沃歇尔的相同,除了一个来源,对吗?

ØV3ØV2ËØVË

有关更多详细信息,请查阅您最喜欢的算法教科书。(您一本最喜欢的算法教科书,不是吗?)


您介意分享您最喜欢的算法教科书吗?
阿卜杜勒2015年


@阿卜杜勒上诱饵。-麻省理工学院/斯坦福大学使用的教科书是T. Cormen等。算法简介。康奈尔大学使用的教科书是J. Kleinberg等人的《算法设计》。cs.sjtu.edu.cn/~jiangli/teaching/CS222/files/materials/…–
AffluentOwl

2

这三种算法均在Jaehyun Park教授(斯坦福大学)的讲座幻灯片中介绍。这是链接最短路径算法


这不能回答有关差异的问题,并且不是自成体系的,只是没有摘要的链接不能算作好答案。同样,它似乎是多余的,因为它所涵盖的内容不只现有答案。
Evil

1

最短路径问题维基百科页面描述了两个不同的问题:SSSP和APSP。

单源最短路径(SSSP):

  • Dijkstra的算法:解决了单源最短路径问题。
    • 约束:它只能处理负边。
    • 未加权图:Dijkstra与BFS相同。
  • Bellman-Ford算法:如果边缘权重可能为负,则解决单源问题。这是对Dijkstra的改进,Dijkstra现在也可以处理负重。

全对最短路径(APSP):

  • Floyd–Warshall算法:解决所有对最短路径。处理正边缘和负边缘。
    • 约束:无法处理负循环。

因此,Floyd–Warshall与BFS不同,尽管其基本方法是相同的,即动态编程。


1

也许这应该是评论而不是答案,但这是其他答案未提及的这些算法之间的区别。

人们倾向于将弗洛伊德算法称为Floyd -Warshall,但是Floyd和Warshall的算法并不相同。

Ø1Øñ2

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.