【问题标题】:The best shortest path algorithm最佳最短路径算法
【发布时间】:2009-12-04 13:06:24
【问题描述】:

“Floyd-Warshall 算法”“Dijkstra 算法” 有什么区别,哪个最适合在图中找到最短路径?

我需要计算网络中所有对之间的最短路径,并将结果保存到数组中,如下所示:

**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

【问题讨论】:

  • 但另一个已关闭,主要是因为用户的英语不好,其中一种解决方案将这两种算法命名为替代方案。如果我们将其作为 dup 关闭,作者将如何找到有关上一个问题的更多信息?我们真的会好到可以去那里投票重新开放吗?
  • 嗨,抱歉,我想添加一个关于图片的数组示例,但我没有这样做
  • 感谢 SilentGhost 重新编辑我的问题
  • 该图中的 DE 不应该是 15 吗?

标签: algorithm shortest-path


【解决方案1】:

Dijkstra 的算法在图中找到一个节点和每个其他节点之间的最短路径。您将为每个节点运行一次。权重必须为非负数,因此如有必要,您必须先对图中的值进行归一化。

Floyd-Warshall 在一次运行中计算所有节点对之间的最短路径!循环权重必须是非负数,并且图表必须是有向的(您的图表不是)。

Johnson 的算法是使用 Dijkstra 的算法在一次遍历中找到所有对,并且对于稀疏树更快(请参阅链接进行分析)。

【讨论】:

  • 从您为 Dijkstra 引用的维基百科链接中:“算法在该顶点和 每个 其他顶点之间找到成本最低的路径”(我的重点)。因此,您不需要为每对顶点运行它,而只需为每个顶点运行。
  • 您可以通过将每条边 uv 替换为具有相同权重的两条边 (u,v) 和 (v,u) 来将无向图转换为有向图。那么大概 Floyd-Warshall 应该可以正常工作?
  • err .. floyd-warshall 不要求它具有非负边,来自维基百科“是一种图形分析算法,用于在具有正边或负边权重的加权图中查找最短路径(但没有负循环)”
【解决方案2】:

Floyd Warshall 会找到所有顶点对之间的路径,但 Dijkstra 只找到从一个顶点到所有其他顶点的路径。

Floyd Warshall 是 O(|V|3) 而 Dikstra 是 O(|E| + |V| log |V|) 但是你必须运行它 V 次才能找到所有我猜对,它给出了 O(|E * V| + |V2| log |V|) 的复杂度。这意味着重复使用 Dijsktra 可能比 FW 算法更快,我会尝试两种方法,看看哪种方法在实际情况下最快。

【讨论】:

  • Francis Haart 的评论:“@Andreas Brinck,在完整的图表中,E=(V^2-V)/2 和 dijkstra 不会更快。”
【解决方案3】:

Dijkstra 从一个顶点找到最短路径,Floyd-Warshall 在所有顶点之间找到它。

【讨论】:

    【解决方案4】:

    如果您想找到 所有 对顶点之间的最短路径,请使用 Floyd-Warshall 算法,因为它的运行时间比 Dijkstra 算法(远)长。

    Floyd-Warshall 算法的最差情况性能为 O(|V|3),而 Dijkstra 算法的最差情况性能为 O(|E| + |V|log |V |)

    【讨论】:

      【解决方案5】:

      Dijkstra's 主要用于单对最短路径查找,即从一个节点到所有其他节点,其中 Floyd-Warshall 用于全对最短路径,即所有顶点对之间的最短路径。 Floyd-Warshall 算法的最坏情况性能为 O(|V|3),而 Dijkstra 算法的最坏情况性能为 O(|E| + |V|log |V|) 此外,Dijkstra 不能用于负权重(我们也使用 Bellmann Ford)。但是对于 Floyd-Warshall,我们可以使用负权重,但不能使用负循环

      【讨论】:

        【解决方案6】:

        同时,针对单源最短路径问题的更好算法是已知的。一个实际相关的是derivation of Dijkstra's algorithm by Torben Hagerup。该算法具有与 Djikstra 相同的最坏情况复杂度,但在平均情况下,预期运行时间与图的大小呈线性关系,这比纯 Dijkstra 快得多。该算法的思想是基于这样的思想,即不需要总是从队列中轮询最小边。可以从队列中轮询一条边,其权重为1+k 是最小边权重的倍,其中k0 大一些。即使选择了这样一条边,算法仍然会找到最短路径。

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-25
        相关资源
        最近更新 更多