在这篇文章中,Dijkstras被描述为一种贪婪算法,而这里和这里显示它与动态规划算法有联系。
那么是哪一个呢?
这是贪婪的,因为你总是标记最近的顶点。它是动态的,因为距离是使用先前计算的值更新的。
我想说它绝对更接近动态规划而不是贪婪算法。为了找到从A到B的最短距离,它不决定一步一步走哪条路。相反,它会找到从A出发可以去的所有地方,并标记到最近的地方的距离。然而,标记那个地方并不意味着你会去那里。这只意味着距离不能再缩短,假设图的所有边都是正的。这个算法本身并没有很好的方向感告诉你哪条路能让你更快地找到B。最优决策不是贪婪地做出的,而是用尽所有可能缩短距离的路线做出的。因此,它是一种动态规划算法,唯一的不同之处在于阶段不是预先知道的,而是在算法过程中动态确定的。如果你愿意,你可以称之为"动态"动态规划算法,以便将它与其他具有预定决策阶段的动态规划算法区分开来。
与Kruskal最小生成树算法相比,差异明显。在Kruskal算法中,你总是选择不会导致循环的最短边,然后是下一条最短边,以此类推。算法一步一步地选择最优策略,只执行一个选择。其他可能性没有经过算法的检查或比较,即使数学定理保证它们不会是最优的。所以对我来说Kruskal是贪婪的而Dijkstra是动态规划的