最短路径算法:动态规划与Dijkstra算法

时间:2015-01-26 06:16:33

标签: algorithm time-complexity dynamic-programming dijkstra

通过使用 memoization 的动态编程在有向非循环图(DAG)上运行最短路径算法,其运行时复杂度为O(V + E),可使用以下公式进行验证:

d(s,v) = min{ d(s,u) + w(u,v) }, over all vertices u->v

现在,Dijkstra的算法还需要指导图表。该算法使用最小优先级队列的运行时复杂度为O(E + V.log(V)),这明显慢于DP的记忆版本。

根据wiki

  

对于具有无界非负权重的任意有向图,这是渐近最快的已知单源最短路径算法。

我在这里遗漏了什么吗?我只是无法消化这里的矛盾..

2 个答案:

答案 0 :(得分:2)

在你的动态编程中,我不认为它是一个正确的公式,因为它是基于d(s,u)已经是s,u之间的最短路径这一事实。但你无法证实这一点。确认你应该得到'#34;最短的顶点"使用贪婪方法一步一步,这就是Dijkstra的算法所做的。

对于动态编程,Floyd-Warshall算法是一种典型的方法,您可以引用它http://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm。仔细想想!

答案 1 :(得分:1)

Dijkstra的算法不仅限于DAG;它可以在没有负路径权重的任何图形上运行,循环或其他。您最有可能引用的拓扑排序未通过Wiki引用的“任意”条款。