首页 > 代码库 > 理解动态规划、分治法和贪心法

理解动态规划、分治法和贪心法

本文转自: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元就够了   

 

理解动态规划、分治法和贪心法