有比Dijkstra更快的算法吗?

时间:2009-11-09 14:16:32

标签: graph-theory dijkstra

给定一个只有正边权重的有向连通图,是否有更快的算法来找到两个顶点之间的最短路径,而不是使用斐波纳契堆的Dijkstra?

维基百科说,Dijkstra在O(| E | + | V | * log(| V |))(使用斐波那契堆)。

我不是在寻找优化,例如,执行时间的一半,而是具有不同时间复杂度的算法(例如从O(n * log n)到O(n))。

此外,我想了解您对以下方法的看法:

  1. 确定所有边缘权重的GCD。
  2. 将图形转换为具有均匀边缘权重的图形。
  3. 使用BFS查找两个给定顶点之间的最短路径。
  4. 第2点的示例:
    想象一下GCD是1.然后我会改变边缘
    A ---> B(边缘重量3)

    A-> A' - > A'' - > B(边缘重量1的3倍)
    这种转换需要花费不变的时间,并且必须针对每个边缘进行一次。所以我希望这个算法在O(| E |)(变换)+ O(| E | + | V |)(BFS)= O(2 * | E | + | V |)= O(| E | + | V |)

    感谢您抽出宝贵时间阅读我的问题,希望不要浪费你的时间^^。祝你有愉快的一天。

4 个答案:

答案 0 :(得分:10)

你为你的算法做的大分析是非常有缺陷的。假设所有边都是素数。新图中的边数将等于所有权重的总和。因此,图表的O(|E| + |V|)实际上是原始图表中的O(W x |E| + |V|),可能比O(|E| + |V| log |V|)大得多。

答案 1 :(得分:6)

  

算法比Dijkstra快吗?

是。这个问题不合格,因此在所有情况下甚至在大多数情况下都要求更好的性能。在单个案例中具有更好性能的算法足以建立肯定答案。

  

尽管通常需要更多的迭代次数   Bellman-Ford方法超过Dijkstra的方法,在实践中Bellman-Ford方法可以   因为每次迭代的开销较小而优越[Golden,B.,1976。“Shortest-Path Algorithms:A Comparison”,Operations Research,Vol。 44,pp.1164-1168]。

以上引用来自Dimitri P. Bertsekas(1992年3月)。 “用于最短路径的简单快速标签校正算法”(PDF)。网络,卷。 23,pp.703-709,1993。http://www.mit.edu/people/dimitrib/SLF.pdf。检索2008-10-01。

简而言之,我的主张基于Bertsekas对Golden的解释。无论我的结论是否成立,您可能会发现Bertsekas将Dijkstra算法分类为标签设置方法很有趣,与标签修正方法形成对比。

答案 2 :(得分:1)

有一种算法有O(1):将权重转换成链长,并使用关键环作为节点(真正的钥匙环就像你口袋里的那些)。用正确的链条连接钥匙圈。选择两个节点并将它们彼此拉开。

遵循从一个节点到另一个节点的拉紧链。这是最短的路径。

要将其作为计算机程序实现,您需要两个工业机器人:)

对于一个更真实的例子,使用Ant colony optimization可以在短时间内获得非常好的结果。由于您可以在此算法中指定运行次数,因此您可以决定花费多少时间(即运行时仅取决于节点数),这样可以得到O(n)但不能保证完美结果。

答案 3 :(得分:0)

总是有A *,它的衍生类似于Hierarchical A *和A * JPS。