Dijkstra的算法是一种贪婪或动态的编程算法?

vka*_*l11 16 algorithm dijkstra dynamic-programming greedy

这篇文章中,它将Dijkstras描述为一种贪婪的算法,而在这里这里它被证明与动态编程算法有联系.

那是哪一个呢?

Gri*_*yan 31

这很贪婪,因为你总是标记最近的顶点.它是动态的,因为距离是使用先前计算的值更新的.

  • 那么这是一个在一个算法中学习这两个概念的好地方. (3认同)
  • @vkaul11 我建议从背包或其他简单的动态规划算法开始,以获得 dp 的真实感受。 (2认同)

Zhu*_* He 6

我会说它绝对更接近动态编程而不是贪婪算法.要找到从A到B的最短距离,它不会一步一步地决定走哪条路.相反,它会找到一个可以从A出发的地方,并标记到最近的地方的距离.然而,标记那个地方并不意味着你会去那里.这只意味着假设图的所有边都是正的,距离不能再缩短.算法本身没有很好的方向感,因为哪种方式可以让你更快地放置B. 最佳决策不是贪婪的,而是通过耗尽可能缩短距离的所有可能路线来做出的.因此,它是一种动态编程算法,唯一的变化是这些阶段不是事先知道的,而是在算法过程中动态确定的.如果您愿意,可以将其称为"动态"动态编程算法,将其与其他动态编程算法区分开来,并确定预定的决策阶段.

与Kruskal最小生成树算法相比,差异很明显.在Kruskal算法中,您始终选择不会导致循环的最短边,然后选择下一个最短边,依此类推.逐步选择最优策略,在算法中只有一个选择.其他可能性不是通过算法检查或比较的,即使数学上定理保证它们不是最优的.所以对我来说Kruskal很贪婪,但Dijkstra是动态编程.