动态规划和贪心算法的区别

动态规划:

动态规划应用于子问题重合的情况不同的子问题具有相同的子子问题

动态规划算法将每个子问题求解一次,将其解保存在一个表格中,需要时进行调用。

  1. 刻画一个最优解的结构特征。
  2. 递归的定义最优解的值。
  3. 计算最优解的值,有自顶向下和自底向上的方法,通常采用自底向上的方法。

一、DP思想:
1、把一个大的问题分解成一个一个的子问题。
2、如果得到了这些子问题的解,然后经过一定的处理,就可以得到原问题的解。
3、如果这些子问题与原问题有着结构相同,即小问题还可以继续的分解。
4、这样一直把大的问题一直分下去,问题的规模不断地减小,直到子问题小到不能再小,最终会得到最小子问题。
5、最小子问题的解显而易见,这样递推回去,就可以得到原问题的解。

贪心算法:

每一步都做出当时看起来最佳的选择,也就是说,它总是做出局部最优的选择。

贪心算法的设计步骤:

  1. 对其作出一个选择后,只剩下一个子问题需要求解。
  2. 证明做出贪心选择后,原问题总是存在最优解,即贪心选择总是安全的。
  3. 剩余子问题的最优解与贪心选择组合即可得到原问题的最优解

联系:

  1. 都是分解成子问题来求解,都需要具有最优子结构
  2. 所有的贪心问题都可以用动态规划来求解,可以这么说,贪心算法是动态规划的特例。

区别:

1.贪心:每一步的最优解一定包含上一步的最优解,上一步之前的最优解则不作保留;

动态规划:全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有的局部最优解 

也就是说,假如你要求第十步的最优解,那么第十步的最优解肯定与第九步的最优解有关,而第九步的最优解肯定与第八步的最优解有关。可以这么理解,贪心算法第十步的最优解得把前面九步的最优解都用上了,但是动态规划你需要求第十步的最优解,这个最优解可能只与第八步,第三步,第一步有关,与第九步没有关系,我们为什么选择第八步而不选择第九步呢?是因为我们在计算第十步的最优解的时候其实把1-9步的组合的情况都计算了,选择了其中最优的解,也就是第八步的解,其实第十步解的构成与第九步没有关系,动态规划相当于穷举了1-9步最优情况下的组合,选了其中最优的作为第十步的最优解,而贪心算法第十步的最优解肯定是由第九步构成的。

求一个问题的最优解相当于遍历所有的子集来找最优解,但是这样解随着解空间的维度成指数增长,动态规划其实就是一种遍历,但是他是带备忘录的遍历,我前面算到的子问题,到这儿我不在计算,我直接调用之前保存的值,这样就节省了大量的时间。

2.动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常自顶向下的方式进行。

 

3.根据以上两条可以知道,贪心不能保证求得的最后解是最佳的,一般复杂度低;而动态规划本质是穷举法,可以保证结果是最佳的,复杂度高。

贪心算法最经典的例子,给钱问题。   
比如中国的货币,只看元,有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元就够了   

你可能感兴趣的:(数据结构)