【问题标题】:Why does A* run faster than Dijkstra's algorithm?为什么 A* 比 Dijkstra 算法运行得更快?
【发布时间】:2013-11-21 01:31:51
【问题描述】:

维基百科说 A* 在 O(|E|) 中运行,其中 |E|是图中的边数。但是我的朋友说 A* 只是 Dijkstra 算法的一般情况,而 Dijkstra 算法的运行时间为 O(|E| + |V| log |V|)。所以我很困惑为什么 A* 比 Dijkstra 的算法运行得更快。

【问题讨论】:

  • wikipedia 似乎在谈论它和 Djikstra 的区别。我会从那里开始
  • 是的,维基百科的文章说 A* 等同于 Dijkstra 的算法。这就是我感到困惑的地方。
  • 不,它说“...并且 A* 等效于运行 Dijkstra 算法 降低成本 d'(x, y) := d(x, y) - h( x) + h(y)。"
  • 是的,这意味着它应该花费相同的时间,对吧?
  • Dijkstra 是 A* 的一个特例。当 h 没有给出信息时,复杂性是相同的。请参阅SO中的先前答案

标签: algorithm big-o time-complexity dijkstra a-star


【解决方案1】:

本质上,A* 更快,因为它可以使用启发式算法来做出更有根据的猜测,以判断哪条路线是最好的情况,这是 Dijkstra 的算法无法做到的。

【讨论】:

    【解决方案2】:

    我认为 Wikipedia 上列出的 A* 的时间复杂度是不正确的(或者至少是具有误导性的)。这种时间复杂度似乎只计算搜索中扩展的状态数量,而不是确定要探索哪些状态所需的时间。

    为了提高效率,A* 搜索需要存储一个优先级队列,其中包含需要探索边缘中的哪些节点,并且它必须能够在这些优先级上调用 reduce-key。如果使用良好的优先级队列实现,在最坏的情况下,运行时间是 O(n log n + m)。因此,在最坏的情况下,您会期望 A* 降级为 Dijkstra 算法。给定一个好的启发式,A* 不会像 Dijkstra 算法那样扩展所有节点和边,这就是 A* 更快的主要原因。

    当然,A* 搜索的时间复杂度需要考虑计算启发式算法的成本。一些复杂的启发式算法可能无法在 O(1) 时间内计算,在这种情况下,A* 的运行时间实际上可能比 Dijkstra 算法更差

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2012-11-24
      • 2011-03-22
      • 2018-12-30
      • 1970-01-01
      • 2012-07-13
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      相关资源
      最近更新 更多