算法 | 分治和动态规划都是把大问题分解成小问题,有何区别?

108 阅读2分钟
image.png

回答

分治法解决的问题,把大问题分解成小问题后,这些小问题个个都是需要解决的,都不是重复的,每个都必须解决。(也就是不存在「重复子问题」)

但是动态规划解决的问题不一样,动态规划把大问题分解成小问题后,这些小问题是存在「重复子问题」的(通常都会用备忘录来记录重复子问题的解,从而减少小问题的个数,节省时间和空间)

举例说明

  1. 分治法

分治法可以用来实现「归并排序」:不断把数组分成两半,然后不断把两半的数组进行 有序合并,在这个过程中,每个子问题都是要解决的,没有重复的地方,不能说你合并了前面一半数组,就不合并后面一半数组。

image.png
  1. 动态规划

动态规划可以用来实现「斐波那契数列」:要求出第 20 位的数值,必须先求出第 19 和 第 18 位的数值,,要求第 19 位的数值必须先求出第 17 和 第 18 位(重复子问题出现了)的数值

image.png

图片来自 labuladong 文章,侵权删

动态规划解决的问题是可以剪枝的(去除重复子问题),这就是它跟分治算法的最大区别。

动态规划的最优子结构

其实最优子结构说的就是最优的子问题解,整个问题的最优解由每个子问题的最优解构成。这就要求每个子问题求最优解时互相不影响。

举个例子,现在的问题是给定食物(可乐和曼妥思),尽可能吃掉最多。那如果是两个人吃,肯定是每个人能吃多少吃多少,然后才能求得最优解。

但如果是一个人吃,那这个问题就不存在最优子结构,而是选择一种食物然后吃,因为可乐和曼妥思同时进肚子会撑死人的。