最好的最短路径算法

时间:2009-12-04 13:06:24

标签: algorithm shortest-path

“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

6 个答案:

答案 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。即使选择了这样的边缘,算法仍然会找到最短的路径。