贪心算法,递归算法,动态规划算法比较与总结

一般实际生活中我们遇到的算法分为四类:

一>判定性问题

       二>最优化问题

       三>构造性问题

       四>计算性问题

而今天所要总结的算法就是着重解决  最优化问题

《算法之道》对三种算法进行了归纳总结,如下表所示:

 
标准分治


动态规划


贪心算法


适用类型


通用问题


优化问题


优化问题


子问题结构


每个子问题不同


很多子问题重复(不独立)


只有一个子问题


最优子结构


不需要


必须满足


必须满足


子问题数


全部子问题都要解决


全部子问题都要解决


只要解决一个子问题


子问题在最优解里


全部


部分


部分


选择与求解次序


先选择后解决子问题


先解决子问题后选择


先选择后解决子问题

分治算法特征:

1)规模如果很小,则很容易解决。//一般问题都能满足

2)大问题可以分为若干规模小的相同问题。//前提

3)利用子问题的解,可以合并成该问题的解。//关键

4)分解出的各个子问题相互独立,子问题不再包含公共子问题。 //效率高低

【一】动态规划:

依赖:依赖于有待做出的最优选择

实质:就是分治思想和解决冗余。

自底向上(每一步,根据策略得到一个更小规模的问题。最后解决最小规模的问题。得到整个问题最优解)

特征:动态规划任何一个i+1阶段都仅仅依赖 i 阶段做出的选择。而与i之前的选择无关。但是动态规划不仅求出了当前状态最优值,而且同时求出了到中间状态的最优值。

缺点:空间需求大。

【二】贪心算法:

依赖:依赖于当前已经做出的所有选择。

自顶向下(就是每一步,根据策略得到一个当前最优解。传递到下一步,从而保证每一步都是选择当前最优的。最后得到结果)

【三】分治算法:

实质:递归求解

缺点:如果子问题不独立,需要重复求公共子问题

---------------------------------------------------------------------------------------------------------------------------

贪心算法:贪心算法采用的是逐步构造最优解的方法。在每个阶段,都在一定的标准下做出一个看上去最优的决策。决策一旦做出,就不可能再更改。做出这个局部最优决策所依照的标准称为贪心准则。

分治算法:分治法的思想是将一个难以直接解决大的问题分解成容易求解的子问题,以便各个击破、分而治之。

动态规划:将待求解的问题分解为若干个子问题,按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。

二、算法间的关联与不同

1、分治算法与动态规划

分治法所能解决的问题一般具有以下几个特征:

① 该问题的规模缩小到一定程度就可以容易地解决。

② 该问题可以分为若干个较小规模的相似的问题,即该问题具有最优子结构性质。

③ 利用该问题分解出的子问题的解可以合并为该问题的解。

④ 该问题所分解出的各个子问题是相互独立的且子问题即之间不包含公共的子问题。

上述的第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;

第二条特征是分治法应用的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用;

第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑贪心算法或动态规划算法;

第四条特征涉及到分治法的效率,如果各个子问题不是独立的,则分治法要做许多不必要的工作,重复地解公共的子问题。这类问题虽然可以用分治法解决,但用动态规划算法解决效率更高。

当问题满足第一、二、三条,而不满足第四条时,一般可以用动态规划法解决,可以说,动态规划法的实质是: 分治算法思想+解决子问题冗余情况

2、贪心算法与动态规划算法

多阶段逐步解决问题的策略就是按一定顺序或一定的策略逐步解决问题的方法。分解的算法策略也是多阶段逐步解决问题策略的一种表现形式,主要是通过对问题逐步分解,然后又逐步合并解决问题的。

贪心算法每一步都根据策略得到一个结果,并传递到下一步,自顶向下,一步一步地做出贪心决策。

动态规划算法的每一步决策给出的不是唯一结果,而是一组中间结果,而且这些结果在以后各步可能得到多次引用,只是每走一步使问题的规模逐步缩小,最终得到问题的一个结果。

举例:如图1有一三角形数塔,求一自塔顶到塔底的路径,要求该路径上结点的值的和最大。

贪心算法解题过程:自顶向下从第一层9开始,到第二层,选数值较大的15,第三层,在可选路径中选数值较大的8,同理,第四层选9,第五层选10,这样就确定了一条路径:9→15→8→9→10。

动态规划算法接题过程:如图2,阶段1:自第五层开始,对经过第四层的2的路径,在第五层的19、7中选择数值较大的19,同理,对经过第四层18的路径,选10,对经过第四层9的路径,选10,对经过5的路径选16。

以上是一次决策过程,也是一次递推过程和降阶过程。因为以上的决策结果将5阶数塔问题变为4阶子问题,递推出第四层与第五层和为: 
         21(2+19),28(18+10),19(9+10),21(5+16) 
用同样的方法还可以将4阶数塔问题变为3阶数塔问题,……,最后得到1阶数塔问题,这样也确定了一条路径:9→12→10→18→10,就是真个问题的最优解。

显然,以上数塔问题用贪心算法得不到最优解,这里只是用作与动态规划算法的比较。

三、适用条件 
贪心算法

①贪心选择性质:在求解一个问题的过程中,如果再每一个阶段的选择都是当前状态下的最优选择,即局部最优选择,并且最终能够求得问题的整体最优解,那么说明这个问题可以通过贪心选择来求解,这时就说明此问题具有贪心选择性质。

②最优子结构性质:当一个问题的最优解包含了这个问题的子问题的最优解时,就说明该问题具有最优子结构。

分治算法:见二、算法间的关联与不同中的①②③④。

动态规划

①最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。

②无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。

③有重迭子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。

四、优势:

采用动态规划方法,可以高效地解决许多用贪婪算法或分而治之算法无法解决的问题。

但贪心算法也有它的优势:构造贪心策略不是很困难,而且贪心策略一旦经过证明成立后,它就是一种高效的算法。

时间: 2024-08-15 03:49:53

贪心算法,递归算法,动态规划算法比较与总结的相关文章

贪心算法和动态规划算法

动态规划和贪心算法都是一种递推算法 即均由局部最优解来推导全局最优解 (不从整体最优解出发来考虑,总是做出在当前看来最好的选择.) 不同点: 贪心算法 与动态规划的区别:贪心算法中,作出的每步贪心决策都无法改变,由上一步的最优解推导下一步的最优解,所以上一部之前的最优解则不作保留. 能使用贪心法求解的条件:是否能找出一个贪心标准.我们看一个找币的例子,如果一个货币系统有三种币值,面值分别为一角.五分和一分,求最小找币数时,可以用贪心法求解:如果将这三种币值改为一角一分.五分和一分,就不能使用贪心

数据结构与算法学习之路:背包问题的贪心算法和动态规划算法

一.背包问题描述: 有N种物品和一个重量为M的背包,第i种物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大. 二.解决方法: 1.贪心算法:贪心算法基于的思想是每一次选择都作当前最好的选择,这样最后的结果虽然不一定是最优解,但是也不会比最优解差很多. 举个例子说明可能好懂一些:一帮基友去聚餐,菜是一份一份上的,我每一次夹菜都只夹牛肉/海鲜吃,可能到最后我吃的牛肉/海鲜很多,但不一定代表我吃掉的东西的总价值最高,但是相对来说价值也很高

一些常见的递归算法 动态规划算法

最大值的递归算法 对于一个数组 有A[ 1...n ] 算法调用的时候调用max(n) max(i) if i = 1 return A[i] else if A[i]>max(i-1) return A[i] else return max(i-1) end if end if 平均值的递归算法 对于数组 a[ 1...n ] sum 初值为 0 index 初值则为1 调用该算法使用 Ave(a,sum,index) Ave(int a[],int sum,int index) if(ind

动态规划算法的理解

什么是动态规划算法? 动态规划算法其实质就是分治思想和解决冗余.因此它与分治法和贪心法类似,都是将待求解问题分解为更小的,相同的子问题,然后对子问题进行求解,最终产生一个整体最优解. 适合采用动态规划法求解的问题,经分解得到的各个子问题往往不是相互独立的.在求解过程中,将已解决的子问题的解进行保存,在需要时可以轻松地找出. 示例如下: Fibonacci数列       0   n=0 f(n)=  1   n=1 f(n-1)+f(n-2)    n>1 如果n=4,则f(4)=f(3)+f(

五种常用算法之二:动态规划算法

动态规划算法: 基本思想: 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解.与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的.若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次.如果我们能够保存已解决的子问题的答案,而在需要时再找

动态规划算法(转载)

动态规划算法 例题1: https://segmentfault.com/a/1190000008244955 例题2: https://segmentfault.com/a/1190000007927865 讲解: http://www.hawstein.com/posts/dp-novice-to-advanced.html 顶级讲解动态规划:http://www.cnblogs.com/SDJL/archive/2008/08/22/1274312.html(本文转载自此文) 下面是原文:

五大经典算法之动态规划

一.概念起源 ??动态规划,又名DP算法(取自其Dynamic Programming的缩写),最初是运筹学的一个分支,是用来求解决策过程最优化的数学方法. 二.基本思想 ??把 多阶段过程 转化为一系列单阶段过程,利用各阶段之间的关系,逐个求解.那什么叫多阶段过程呢? 多阶段过程:首先大家可以思考一下以下这个问题: 假如我们有面值为1元/3元/5元的硬币若干枚,如何用最少的硬币凑够137元? 当然我们可以使用暴力枚举解决这个问题,不够那样复杂度就太高了.我们可以这样考虑,凑齐137元可以看成一

五大常用算法----贪心、动态规划、分支限界、分治算法和回溯算法

五大常用算法之一:贪心算法 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解. 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择.必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关. 所以对所采用的贪心策略一定要仔细分析其是否满足无后效性. 五大常用算法之二:动态规划算法 五大常用算法之三:分支限界算法

活动选择问题(贪心算法vs动态规划)

活动选择问题贪心算法vs动态规划 基础知识 1-1动态规划 1-2贪心算法 1-3贪心算法vs动态规划 活动选择问题描述 活动选择问题最优子结构 活动选择问题算法设计 4-1贪心算法之选择最早结束活动 4-1-1递归贪心算法 4-1-2迭代的方式进行 4-2贪心算法之选择最短时长活动 4-3动态规划方法实现 4-3-1自上而下的实现 4-3-2自下而上的实现 结论 活动选择问题(贪心算法vs动态规划) 1.基础知识 在讲解活动选择问题之前,我们首先来介绍一动态规划和贪心算法的基础知识 1-1.动