动态规划算法和贪婪算法的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MulinB/article/details/7104673

如果看教科书,经常会看到,动态规划算法适用条件有三个:

1.最优化原理(最优子结构性质)  最优化原理可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质。
2.无后效性  将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性。
3.子问题的重叠性  动态规划将原来具有指数级复杂度的搜索算法改进成了具有多项式时间的算法。其中的关键在于解决冗余,这是动态规划算法的根本目的。 动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其它的算法。

(在CLRS的算法导论里好像只有两个条件:Optimal substructure, and Overlapping subproblems。好像上面的条件限制更强一些,“无后效性”保证了问题可以清晰地分为几个阶段,每个阶段都是必经之路。)

以前总是不理解第一条“最优子结构性质”,感觉好像看起更像是贪婪算法可以适用的地方。其实,正确的理解应该是,仅仅具有最优子结构性质的问题并不能保证可以适用贪婪算法,使用贪婪算法必须有另外一个限制更强的条件:局部最优解就是全局最优解


顺便记录几个学习动态规划算法比较好的资源,其实都可以从Wikipedia上找到这些链接:

1. 一个比较old但是很简单易懂的教程:(http://mat.gsia.cmu.edu/classes/dynamic/dynamic.html)

2. 一个TopCoder会员写的教程,例子非常棒,由浅入深: (http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=dynProg)

3. 比较正规的教学还是要推荐MIT算法导论公开课动态规划(Lecture 15, 由CLRS算法导论作者之一讲解),有视频、作业及答案,等资源。以及贪婪算法(Lecture 16)。


最后贴一个取自第一个Tutorial的图片,感觉很易于直观地理解到底动态规划是用于解决什么类型问题的:

扫描二维码关注公众号,回复: 3858106 查看本文章

(计算从A到J的最短路径,不妨试试从右往左推试试)

猜你喜欢

转载自blog.csdn.net/MulinB/article/details/7104673