DFS探索节点与A *

时间:2016-02-21 08:12:37

标签: search dijkstra depth-first-search a-star

我正在尝试搜索个人项目,其中节点的探索相对昂贵。我在使用DFS(Dijkstra的前向搜索)或A *。

之间犹豫不决

我的问题是,是否会出现A *探索比DFS更多节点的情况?

1 个答案:

答案 0 :(得分:2)

Dijkstra的原始算法不使用最小优先级队列,并且及时运行 | V | ^ 2 (其中| V |是节点数)。基于由Fibonacci堆实现并在 O(| E | + | V | \ log | V |)中运行的最小优先级队列的实现(其中| E |是边数)是由于(Fredman& Tarjan 1984)。对于具有无界非负权重的任意有向图,这是渐近最快的已知单源最短路径算法。但是,专业案例(如有界/整数权重,有向无环图等)确实可以进一步改进。

A * 的时间复杂度取决于启发式。在无界搜索空间的最坏情况下,扩展的节点数在解的深度(最短路径)中呈指数d: O(b ^ d),其中b是分支因子(每个州的平均继承人数)。这假设目标状态完全存在,并且可以从开始状态到达;如果不是,并且状态空间是无限的,算法将不会终止。

A *算法是Dijkstra算法的推广,减少必须探索的子图的大小,如果有其他信息则提供较低的限制在与目标的“距离”上。这种方法可以从线性规划的角度来看:有一个用于计算最短路径的自然线性程序,当且仅当它们形成一致的启发式时,其双线性程序的解决方案是可行的(粗略地说,因为符号约定不同在文献中从一个地方到另一个地方)。这种可行的双重/一致启发式定义了非负的降低成本,A *基本上运行Dijkstra算法,降低了成本。如果对偶满足较弱的可容许性条件,则A *更类似于Bellman-Ford算法。 最差情况表现O(| E |)= O(b ^ {d})最差案例空间复杂度O(| V |)= O(b ^ {d})

Dijkstra算法可视为A *的特例,其中h(x)= 0表示所有x。 然而,应该注意的是, Dijkstra的算法可以更有效地实现,而不会在每个节点包含h(x)值。