转载:http://hi.baidu.com/abcdcamey/item/0d1d6746c9ef4616896d10ac算法
动态规划和贪心算法的区别
动态规划和贪心算法都是一种递推算法
均有局部最优解来推导全局最优解
不一样点:
贪心算法:
1.贪心算法中,做出的每步贪心决策都没法改变,由于贪心策略是由上一步的最优解推导下一步的最优解,而上一部以前的最优解则不做保留。
2.由(1)中的介绍,能够知道贪心法正确的条件是:每一步的最优解必定包含上一步的最优解。
动态规划算法:
1.全局最优解中必定包含某个局部最优解,但不必定包含前一个局部最优解,所以须要记录以前的全部最优解
2.动态规划的关键是状态转移方程,即如何由以求出的局部最优解来推导全局最优解
3.边界条件:即最简单的,能够直接得出的局部最优解
==============================================================================
贪心算法与动态规划
贪心法的基本思路:
从问题的某一个初始解出发逐步逼近给定的目标,以尽量快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法中止。
该算法存在问题:
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张 十、五、1。
每次拿能拿的最大的,就是贪心。
可是必定注意,贪心获得的并非最优解,也就是说用贪心不必定是拿的最少的张数
贪心只能获得一个比较好的解,并且贪心算法很好想获得。
再注意,为何咱们的钱能够用贪心呢?由于咱们国家的钱的大小设计,正好可使得贪心算法算出来的是最优解(通常是个国家的钱币都应该这么设计)。若是设计成别的样子状况就不一样了
好比某国的钱币分为 1元3元4元
若是要拿6元钱 怎么拿?贪心的话 先拿4 再拿两个1 一共3张钱
实际最优呢? 两张3元就够了
求最优解的问题,从根本上说是一种对解空间的遍历。最直接的暴力分析容易获得,最优解的解空间一般都是以指数阶增加,所以暴力穷举都是不可行的。
最优解问题大部分均可以拆分红一个个的子问题,把解空间的遍历视做对子问题树的遍历,则以某种形式对树整个的遍历一遍就能够求出最优解,如上面的分析,这是不可行的。
贪心和动态规划本质上是对子问题树的一种修剪。两种算法要求问题都具备的一个性质就是“子问题最优性”。即,组成最优解的每个子问题的解,对于这个子问题自己确定也是最优的。若是以自顶向下的方向看问题树(原问题做根),则,咱们每次只须要向下遍历表明最优解的子树就能够保证会获得总体的最优解。形象一点说,能够简单的用一个值(最优值)表明整个子树,而不用去求出这个子树所可能表明的全部值。
动态规划方法表明了这一类问题的通常解法。咱们自底向上(从叶子向根)构造子问题的解,对每个子树的根,求出下面每个叶子的值,而且以其中的最优值做为自身的值,其它的值舍弃。动态规划的代价就取决于可选择的数目(树的叉数)和子问题的的数目(树的节点数,或者是树的高度?)。
贪心算法是动态规划方法的一个特例。贪心特在,能够证实,每个子树的根的值不取决于下面叶子的值,而只取决于当前问题的情况。换句话说,不须要知道一个节点全部子树的状况,就能够求出这个节点的值。一般这个值都是对于当前的问题状况下,显而易见的“最优”状况。所以用“贪心”来描述这个算法的本质。因为贪心算法的这个特性,它对解空间树的遍历不须要自底向上,而只须要自根开始,选择最优的路,一直走到底就能够了。这样,与动态规划相比,它的代价只取决于子问题的数目,而选择数目总为1。spa