通过使用 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:
对于具有无界非负权重的任意有向图,这是渐近最快的已知单源最短路径算法。
我在这里遗漏了什么吗?我只是无法消化这里的矛盾..
答案 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引用的“任意”条款。