Dijkstra算法的本质是贪心(Greedy),还是动态规划(Dynamic Programming)?

refer: https://www.zhihu.com/question/22311234
关于贪心和动态规划的区分 一直没想明白,所以借这个机会加深一下印象

贪心是一种特殊的动态规划,因为动态规划的本质是独立的子问题 而贪心的本质是吗欸此找到当前的最优解(就是说我们有几个选择 我们不知道选择了一个之后会经历什么 我们只是选择当前最佳的选择)。
贪心和动态规划不是互斥的。贪心更快,但是约束更强 适用范围更小。

为什么知道这些那么重要?
因为现在已经见过许许多多的问题了 很多问题都是最优化问题 比如求最大最小。
而且显而易见的是 在求解这些问题的时候 我们有很大的解空间,而求最佳解的过程类似于一个树,称之为求解树。那么怎么样遍历这棵树来找到最优解?显然 我们有BFS和DFS,
如果我们一定要遍历所有才能得到最优解,但是如果遍历所有花费的时间太多怎么办?这时候就需要进行BFS+DFS剪枝 就是backtracking.
但是有些求解树 中间很多节点是重合的 ,结点个数比所有搜索分支的个数少很多个数量级。这类问题较特殊,我们可以保存中间的搜索过程。而记忆化搜索和动态规划本质上就是一个东西,快就快在可以不用重复计算很多中间结果(所谓的最优子问题)
还有一些更加特殊的求解树,他们不但有很多重复节点,而且每次当需要选择分支的时候 总是可以证明,选择某个分支的解总是比选择其他分支要更优。这类问题就是能被贪心求解的问题。

所以总结一下:
BFS,DP,贪心三个方法都是解决最优化问题的方法,根据问题的不同,约束越大的问题可以用越快的方法,越慢的方法可以解决的问题越普适,就跟自然界的普世规律一样。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页