“Floyd-Warshall算法”和“Dijkstra算法”之间有什么区别,哪个最适合在图表中找到最短路径?< / p>
我需要计算网络中所有对之间的最短路径,并将结果保存到数组中,如下所示:
**A B C D E**
A 0 10 15 5 20
B 10 0 5 5 10
C 15 5 0 10 15
D 5 5 10 0 15
E 20 10 15 15 0
答案 0 :(得分:21)
Dijkstra的算法找到节点与图中每个其他节点之间的最短路径。你会为每个节点运行一次。权重必须是非负的,因此如有必要,您必须首先规范化图表中的值。
Floyd-Warshall计算单次运行中所有节点对之间的最短路径!周期权重必须是非负数,图表必须定向(您的图表不是)。
Johnson的算法使用Dijkstra算法在一次通过中查找所有对,并且对于稀疏树更快(参见分析链接)。
答案 1 :(得分:8)
Floyd Warshall找到所有顶点对之间的路径,但Dijkstra只找到从一个顶点到所有其他顶点的路径。
Floyd Warshall是O(| V | 3 )而Dikstra是O(| E | + | V | log | V |)但是你必须运行它V次以找到所有我认为,这给出了O(| E * V | + | V 2 | log | V |)的复杂度。这意味着重复使用Dijsktra可能比FW算法更快,我会尝试两种方法,看看哪一种方法在实际情况下最快。
答案 2 :(得分:3)
Dijkstra只从一个顶点找到最短路径,Floyd-Warshall在所有之间找到它。
答案 3 :(得分:2)
如果你想找到所有对顶点之间的最短路径,请使用Floyd-Warshall算法,因为它的运行时间比Dijkstra算法高很多。
Floyd-Warshall算法的最差情况是O(| V | 3 ),其中Dijkstra的情况表现为O(| E | + | V | log | V |)
答案 4 :(得分:0)
Dijkstra主要用于单对最短路径发现,即从一个节点到所有其他节点,其中Floyd-Warshall用于所有对最短路径,即所有顶点对之间的最短路径。 Floyd-Warshall算法的最差情况是O(| V | 3),其中Dijkstra的情况表现为O(| E | + | V | log | V |) Dijkstra也不能用于负重量(我们也使用Bellmann Ford)。但是对于Floyd-Warshall,我们可以使用负权重但没有负周期
答案 5 :(得分:0)
同时,已知用于单源最短路径问题的更好算法。实际相关的是derivation of Dijkstra's algorithm by Torben Hagerup。该算法具有与Djikstra相同的最差情况复杂度,但在平均情况下,预期的运行时间在图形的大小上是线性的,这比纯Dijkstra快得多。该算法的思想基于这样的思想,即不需要总是从队列中轮询最小边缘。可以从队列中轮询边缘,其权重是最小边缘权重的1+k
倍,其中k
是一些更大的0
。即使选择了这样的边缘,算法仍然会找到最短的路径。