动态规划与贪心算法的区别

动态规划:
动态规划应用于子问题重合的情况,不同的子问题具有相同的子子问题,

动态规划算法将每个子问题求解一次,将其解保存在一个表格中,需要时进行调用。

刻画一个最优解的结构特征。
递归的定义最优解的值。
计算最优解的值,有自顶向下和自底向上的方法,通常采用自底向上的方法。
一、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

posted @ 2020-03-27 15:53  任仁人  阅读(5986)  评论(0编辑  收藏  举报