算法与数据结构#分治与动态规划

分治法,动态规划法,这两者之间有类似之处,比如都需要将问题划分为一个个子问题,然后通过解决这些子问题来解决最终问题。但其实这两者之间的区别还是蛮大的。

 

动态规划也是一种分治思想(比如其状态转移方程就是一种分治),但与分治算法不同的是,分治算法是把原问题分解为若干个子问题,自顶向下求解子问题,合并子问题的解,从而得到原问题的解。动态规划也是把原始问题分解为若干个子问题,然后自底向上,先求解最小的子问题,把结果存在表格中,在求解大的子问题时,直接从表格中查询小的子问题的解,避免重复计算,从而提高算法效率。

 

相同点:

(1) 原问题需要具有最优子结构性质;

(2) 解决思路都是将原问题分解成若干个规模较小的子问题。

不同点:

(1) 分治法要求子问题之间相互独立,子问题的分解中不能包含公共子问题;

(2) 动态规划是应对子问题之间有重复的解决方案;

(3) 分治法一般采用递归来求解;

(4) 动态规划一般采用迭代法通过自底而上求解,或者通过具有记忆功能的迭代自顶而下求解。

 

(1)最优子结构

是指问题的最优解包含其子问题的最优解。最有子结构是使用动态规划的最基本的条件,如果不具有最优子结构性质,就不可以使用动态规划解决。证明的例子

(2) 子问题重叠

子问题重叠不是使用动态规划的必要条件,但是问题存在子问题重叠的特性更能够充分彰显动态规划的优势。

举个例子:求斐波那契数列时fib(8)=fib(7)+fib(6),其中fib(8)的最优解就包含了子问题fib(7)的最优解和子问题fib(6)的最优解,反过来讲只要我们求解出子问题的最优解,那么就可以构造出问题的最优解,这也就是为什么最优子结构是求解动态规划的必要条件。fib(7)和fib(6)中有相同的子问题fib(5),这就是子问题重叠。

(3) 动态规划的维数

斐波那契数列问题中的递归方程中只涉及一个变量i,所以是一维的动态规划,最长公共子序列问题中,递归方程中涉及两个变量,是二维的动态规划。一个很直观的理解就是,动态规划在从子问题的最优解来得到问题的最优解的过程中所填写的那张表格是几维的,就是几维的动态规划。

最长公共子串(Longest Common Substring)与最长公共子序列(Longest Common Subsequence)的区别: 子串要求在原字符串中是连续的,而子序列则只需保持相对顺序一致,并不要求连续。

(4) 如何验证最优子结构特性

先写出问题的最优解和子问题的最优解的关系,然后假定问题的最优解成立(上面关系的左边成立),看能否得到子问题的最优解就是关系式右边的子问题最优解的形式,如果是就验证了最优子结构(一般用反证法)。

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