理解动态规划、分治法和贪心法
本文转自:http://www.cnblogs.com/airwindow/p/4067902.html
http://hi.baidu.com/35661327/blog/item/d5463e17f1e8d011972b439c.html
动态规划、分治法和贪心法都是利用求解子问题,而后利用子问题求解更上层问题,最终获得全局解决方案的方法。
但是三者的应用场景和性质却存在着极大的不同:
1.分治法
很容易与动态规划问题混淆,但两者却有着本质上的差异。
分治法采用的是递归的思想来求解问题,两个分解的子问题独立求解,其之间无任何的重叠。而上一层问题只需要对两个子问题进行一定的merge即可得到答案。
即s(t)= s(sub1)+s(sub2),但是s(sub1)和s(sub2)之间(看子问题)无任何重叠。
典型应用:
a. 并规排序。
b. 芯片诊断。(前提是对的芯片>错误的芯片)
2. 贪心法
可以定义为 s(t)= s(t-1) + selection acoording to certain criteria。
同样其使用了类似迭代子问题的求解方式,逐步求得全局的最优答案。而其只有一个s(t-1),故不存在重叠求解子问题的情况。
3. 动态规划方法
该种方法较为复杂,但十分有用和高效,其核心性质是当前当前问题的答案s(t),并不能单独由s(t-1)求得。还有可能需要使用到s(1)...s(t-1)。具体需要使用到那些,是由问题本身的性质所决定的(常常是一个约束,或变相的约束)
4:区别
一般贪心算法解决一维的问题
动态规划算法解决二维的问题
贪心算法是特殊的动态规划问题
贪心法的基本思路:
从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法停止。
该算法存在问题:
1. 不能保证求得的最后解是最佳的;
2. 不能用来求最大或最小解问题;
3. 只能求满足某些约束条件的可行解的范围。实现该算法的过程:
从问题的某一初始解出发;
while 能朝给定总目标前进一步 do
求出可行解的一个解元素;
由所有解元素组合成问题的一个可行解
贪心算法最经典的例子,给钱问题。
比如中国的货币,只看元,有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元就够了