【问题标题】:Are there faster algorithms than Dijkstra?有比 Dijkstra 更快的算法吗?
【发布时间】:2009-11-09 14:16:32
【问题描述】:

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

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

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

此外,我想知道您对以下方法的看法:

  1. 确定所有边权重的 GCD。
  2. 将图转换为具有统一边权重的图。
  3. 使用 BFS 查找两个给定顶点之间的最短路径。

第 2 点的示例:
想象 GCD 为 1。然后我将变换边缘
A--->B(边重 3)
进入
A->A'->A''->B (3 倍边重 1)
这种转换需要固定的时间,并且必须为每条边完成一次。所以我希望这个算法在 O(|E|) (transformation) + O(|E| + |V|) (BFS) = O(2 * |E| + |V|) = O(|E|) + |V|)

感谢您花时间阅读我的问题,我希望没有浪费您的时间^^。祝你有美好的一天。

【问题讨论】:

  • 我想你忘记计算 GCD 的成本了。
  • 转换不会在恒定时间内运行。您必须创建可变数量的新顶点。
  • GCD 将是最好的使用价值,但总是可以退回并只使用 1,这样就没有时间花在第 1 步上。

标签: graph-theory dijkstra


【解决方案1】:

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

【讨论】:

  • 你是对的。在最坏的情况下,所有边权重都是素数,并且图是完整的。因此,W 至少为 |V|^2(|V|^2 个边,权重 >= 1)。所以我的算法运行在 |V|^2 * |V|^2 + |E| = |V|^4 + |E|至少。但是,我最初的问题仍未得到解答。
  • 对不起,我的意思是 |V|^4 + |V| - 为什么我不能编辑我的帖子或我的 cmets?
  • 我不确定对于任意图是否有渐近更快的算法。我知道最快的是带斐波那契堆的 Dijkstra。不过我不能确定。
【解决方案2】:

有比 Dijkstra 更快的算法吗?

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

尽管通常需要更多的迭代次数 Bellman-Ford 方法优于 Dijkstra 方法,在实践中,Bellman-Ford 方法可以 优越,因为每次迭代的开销较小 [Golden, B., 1976。“最短路径算法:比较”,运筹学,卷。 44,第 1164-1168 页]。

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

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

【讨论】:

  • 他专门询问了具有较低渐近运行时间的解决方案。
  • 好的,所以在通往最终结果的路上把它当作一个引理。
  • 首先,“在实践中”更快的结果与渐近更好的增长无关,因为在实践中遇到的图是有限的并且通常很小。此外,1976 年的更快并不一定会转化为 2009 年的更快。一方面,今天的“实践中”图表更大——举个夸张的例子,在 n=50 时,200x^2n^3 快四倍,但在 n=1000 时慢五分之一。
  • 是的,我对渐近运行时非常感兴趣。我想知道,如果 Dijkstra 是这个问题的下限,因为 n*log n 用于对定义了总顺序的任意对象进行排序。
【解决方案3】:

有一种算法具有 O(1):将权重转换为链长度,并为节点使用钥匙环(真正的钥匙环就像你口袋里的钥匙环)。用正确的链子连接钥匙环。选择两个节点并将它们拉开。

沿着从一个节点到另一个节点的紧链。这是最短路径。

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

对于更真实的示例,请使用Ant colony optimization,它会在短时间内提供非常好的结果。由于您可以在此算法中指定运行次数,因此您可以决定它花费了多少时间(即运行时间仅取决于节点的数量),这给您 O(n) 但不能保证完美的结果。

【讨论】:

  • 我其实可以想到一个 O(L) 算法,其中 L 是正确解中的节点数:quantum-bogo-shortest-path (en.wikipedia.org/wiki/Bogosort#Quantum_Bogosort)
  • 如果不考虑图形构建步骤,Is 为 O(1)。
  • @Marthinho:在初始设置(不算数)之后,您只需执行一个操作:将节点拉开。好吧,它的舌头在脸颊:)
  • 我想我可以证明任何此类算法的 O(L) 下限。
  • @Aaron,无论如何,你的资源仍然比我的少(两个工业机器人 vs 摧毁几个宇宙)。
【解决方案4】:

总是有 A*,它是 Hierarchical A* 和 A* JPS 之类的衍生物。

【讨论】:

  • 我认为 A* 取决于是否存在某种有意义的启发式方法来判断哪条路线可能是最佳路线。
猜你喜欢
  • 2013-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 2023-03-19
  • 2011-06-15
  • 2016-01-30
相关资源
最近更新 更多