维基百科说A *在O(| E |)中运行,其中| E |是图中边的数量。但是我的朋友说A *只是Dijkstra算法的一般情况,而Dijkstra的算法在O(| E | + | V | log | V |)中运行。所以我很困惑为什么A *跑得比Dijkstra算法快。
答案 0 :(得分:10)
我认为维基百科上列出的A *的时间复杂度是不正确的(或者至少,它具有误导性)。那个时间复杂性似乎只计算在搜索中扩展的状态数,而不是确定要探索哪些状态所需的时间。
为了提高效率,A *搜索需要存储一个优先级队列,其中包含需要探索边缘的哪些节点,并且必须能够在这些优先级上调用reduce-key。在最坏的情况下,如果使用良好的优先级队列实现,则运行时间为O(n log n + m)。因此,在最坏的情况下,您希望A *降级为Dijkstra算法。鉴于良好的启发式算法,A *不会扩展Dijkstra算法的所有节点和边缘,这是A *更快的主要原因。
当然,A *搜索的时间复杂度需要考虑计算启发式的成本。一些复杂的启发式方法可能无法在时间O(1)中计算,在这种情况下,A *的运行时实际上可能比Dijkstra的算法更差。
希望这有帮助!
答案 1 :(得分:2)
本质上A *更快,因为它可以使用启发式方法进行更多有根据的猜测,了解哪种路线最适合用作情况,这是Dijkstra算法不能做到的。