动态规划与贪心算法的区别
动态规划:
动态规划应用于子问题重合的情况,不同的子问题具有相同的子子问题,
动态规划算法将每个子问题求解一次,将其解保存在一个表格中,需要时进行调用。
刻画一个最优解的结构特征。
递归的定义最优解的值。
计算最优解的值,有自顶向下和自底向上的方法,通常采用自底向上的方法。
一、DP思想:
1、把一个大的问题分解成一个一个的子问题。
2、如果得到了这些子问题的解,然后经过一定的处理,就可以得到原问题的解。
3、如果这些子问题与原问题有着结构相同,即小问题还可以继续的分解。
4、这样一直把大的问题一直分下去,问题的规模不断地减小,直到子问题小到不能再小,最终会得到最小子问题。
5、最小子问题的解显而易见,这样递推回去,就可以得到原问题的解。
贪心算法:
每一步都做出当时看起来最佳的选择,也就是说,它总是做出局部最优的选择。
贪心算法的设计步骤:
对其作出一个选择后,只剩下一个子问题需要求解。
证明做出贪心选择后,原问题总是存在最优解,即贪心选择总是安全的。
剩余子问题的最优解与贪心选择组合即可得到原问题的最优解。
联系:
都是分解成子问题来求解,都需要具有最优子结构
所有的贪心问题都可以用动态规划来求解,可以这么说,贪心算法是动态规划的特例。
区别:
1.贪心:每一步的最优解一定包含上一步的最优解,上一步之前的最优解则不作保留;
动态规划:全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有的局部最优解
也就是说,假如你要求第十步的最优解,那么第十步的最优解肯定与第九步的最优解有关,而第九步的最优解肯定与第八步的最优解有关。可以这么理解,贪心算法第十步的最优解得把前面九步的最优解都用上了,但是动态规划你需要求第十步的最优解,这个最优解可能只与第八步,第三步,第一步有关,与第九步没有关系,我们为什么选择第八步而不选择第九步呢?是因为我们在计算第十步的最优解的时候其实把1-9步的组合的情况都计算了,选择了其中最优的解,也就是第八步的解,其实第十步解的构成与第九步没有关系,动态规划相当于穷举了1-9步最优情况下的组合,选了其中最优的作为第十步的最优解,而贪心算法第十步的最优解肯定是由第九步构成的。
求一个问题的最优解相当于遍历所有的子集来找最优解,但是这样解随着解空间的维度成指数增长,动态规划其实就是一种遍历,但是他是带备忘录的遍历,我前面算到的子问题,到这儿我不在计算,我直接调用之前保存的值,这样就节省了大量的时间。
2.动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常自顶向下的方式进行。
3.根据以上两条可以知道,贪心不能保证求得的最后解是最佳的,一般复杂度低;而动态规划本质是穷举法,可以保证结果是最佳的,复杂度高。
贪心算法最经典的例子,给钱问题。
比如中国的货币,只看元,有1元2元5元10元20、50、100 如果我要16元,可以拿16个1元,8个2元,但是怎么最少呢?
如果用贪心算,就是我每一次拿那张可能拿的最大的。 比如16,我第一次拿20拿不起,拿10元,OK,剩下6元,再拿个5元,剩下1元也就是3张 10、5、1。
比如某国的钱币分为 1元3元4元 ,如果要拿6元钱 怎么拿?贪心的话 先拿4 再拿两个1 元,一共3张钱 。实际最优呢? 两张3元就够了
————————————————
版权声明:本文为CSDN博主「冲鸭,屎壳郎」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/youhuakongzhi/article/details/100518166