动态规划与贪心算法比较

动态规划和贪心算法比较

动态规划:

动态规划一般分为线性动规、区域动规、树形动规、背包动规四类

动态规划程序设计师是对解最优化问题的一种途径、一种方法,而不是一种特殊的算法,并不是一个标准的数学表达式和明确清晰的解题方法。往往针对一种最优化问题,问题的性质不同,确定优化的条件也不同,所以就有不同的动态规划解题方法。

 

基本思想:

动态规划通常求解具有某种最优性质问题,找到最优解。动态规划与分支法类似,器基本思想也是将待求解问题分解若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

与分治法不同的是,动态规划求解的问题,经分解得到的子问题不是相互独立的;而分治法求解的问题,分解得到的子问题数目太多,有些问题被重复计算量很多次。

如果我们能够保存已解决的子问题的答案,而在需要时找到此答案,这样就可以避免大量的重复计算,节省时间。这样就可以使用一个表记录所有已解的子问题的答案,不管子问题以后是否被用到,只要他被计算过,就将其结果填入表汇总,这就是动态规划的基本思路。

基本概念:

多阶段决策问题:

如果一类活动过程可以分为若干互相联系的阶段,在每一个阶段都需要作出决策(采取措施),一个阶段的决策会影响到下一个阶段的决策,从而就完全确定了一个过程的活动路线,则称它为多阶段决策问题。

 

经典例题有:

1.硬币找零

  扩展1:单路取苹果

  扩展2:装配线调度

2.字符串相似度/编辑距离(edit distance

  应用1:子串匹配

  应用2:最长公共子序列

3.最长公共子序列(Longest Common Subsequence,lcs)

  扩展1:输出所有lcs

  扩展2:通过LCS获得最长递增自子序列

4.最长递增子序列(Longest Increasing Subsequence,lis

  扩展:求解lis的加速

5.最大连续子序列和/

  扩展1:正浮点数数组求最大连续子序列积

  扩展2:任意浮点数数组求最大连续子序列积

6.矩阵链乘法

  扩展:矩阵链乘法的备忘录解法(伪码)

7.0-1背包问题

8.有代价的最短路径

9.瓷砖覆盖(状态压缩DP

10.工作量划分

11.三路取苹果

 

贪心算法:

贪心算法greedy algorithm是指在对问题求解是,总是做出在当前最好的选择,也就是说,不从整体最优上加以考虑,他所做出仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广范的许多问题他也能产生整体最优解或者是整体最优解的近似解

基本概念:

贪心算法是一种对某些问题求最优解问题的更简单、更迅速的技术。使用此算法的特点是一步步地进行,对当前情况作出最优选择,,而不考虑各种可能的整体情况;

它省去了为找最优解要穷尽所有可能而必须消耗的大量时间,采用自顶向上,以迭代的方法作出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题,通过进一步贪心选择可得到问题的最优解,每一步能够保证局部最优,但是不一定是整体最优

经典例题:

0-1背包问题

活动安排

最优装船问题

均分纸牌

最大整数

找零钱问题

贪心算法当然也有正确的时候。求最小生成树的Prim算法和Kruskal算法都是漂亮的贪心算法。

贪心法的应用算法有Dijkstra的单源最短路径和Chvatal的贪心集合覆盖启发式

 

动态规划和贪心算法的异同:

动态规划和贪心算法都是一种递推算法

均有局部最优解来推导全局最优解

不同点:

贪心算法:

1.贪心算法中,作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推导下一步的最优解,而上一部之前的最优解则不作保留。

2.贪心法正确的条件是:每一步的最优解一定包含上一步的最优解。

 

动态规划算法:

1.全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解

2.动态规划的关键是状态转移方程,即如何由以求出的局部最优解来推导全局最优解

3.边界条件:即最简单的,可以直接得出的局部最优解


猜你喜欢

转载自blog.csdn.net/qq_39667655/article/details/80296859