我正在阅读“算法入门”第3版。有3种方法可以解决这个问题。我的询问是关于他们中的两个。
没有名字的人
算法首先通过拓扑排序dag(参见第22.4节)对顶点施加线性排序。如果dag包含从顶点u到顶点v的路径,则u在拓扑排序中位于v之前。我们只按拓扑排序顺序对顶点进行一次传递。当我们处理每个顶点时,我们放松离开顶点的每条边。
Dijkstra的算法
这是众所周知的
就本书而言,没有名字的时间复杂度是O(V + E),而Dijstra的时间复杂度是O(ElogV)。我们不能使用Dijkstra的负重量,但我们可以使用另一个。使用Dijkstra算法有什么好处,除了它可以用于循环算法?
答案 0 :(得分:1)
因为你给出的第一个算法只适用于非循环图,而Dijkstra运行在非负权重的图上。 限制是不一样的。
在现实世界中,许多应用程序可以建模为具有非负权重的图形,这就是Dijkstra如此使用的原因。此外,它实现起来非常简单。 Dijkstra的复杂性更高,因为它依赖于优先级队列,但这并不意味着它需要更多的时间来执行。 ( nlog(n)时间并不差,因为log(n)是一个相对较小的数字:log(10 ^ 80)= 266)
然而,这代表稀疏图(边缘密度低)。对于密集图,其他算法可能更有效。