分治法,动态规划区别

分治策略:分治法是建基于多项分支递归的一种很重要的算法范式。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。(维基百科)

分治策略分解的子问题是相互独立且与原问题相同的。很多时候原问题分解成两个子问题多数情况下是行之有效的。

分治策略可以参考上一篇我写的快速排序来理解:快速排序算法

动态规划:也是把一个复杂的问题分成若干个子问题,但与分治法不同,适用动态规划的问题分解后的子问题通常是不互相独立的。这时候,若还用分治的话,会因为子问题太多以至于最后解决问题需要耗费指数级的时间。

一般动态规划步骤分为:

1、刻画最优解的结构特征;

2、递归地定义最优值;

3、以底向上的方法计算最优值;

4、构造最优解;

推荐一篇动态规划的详解,讲得很好

 

接下来结合例子说说两者之间的区别以及什么时候该用动态规划,上面的链接博文浏览一遍再看接下来会容易理解点。

快速排序算法用分治法,因为数组划分为左右两个区域后,两个区域的进一步划分排序又是新的子问题(即对不同的数组子串进行排序),所以称之为相互独立的。

而用动态规划解决的Fibonacci例子中,可以很显然地看到子问题的重叠,“递归树中的每一个子节点都会执行一次,很多重复的节点被执行,fib(2)被重复执行了5次。由于调用每一个函数的时候都要保留上下文,所以空间上开销也不小。这么多的子节点被重复执行,如果在执行的时候把执行过的子节点保存起来,后面要用到的时候直接查表调用的话可以节约大量的时间。”看引用的这一段可以清楚),故而称之为不互相独立。

动态规划中一般用自底向上递归算法解决子问题重叠。引用的博文中“记住求过的解来节省时间”,是动态规划的优势所在,自底向上递归算法先求子问题,再求父问题的解是动态规划的核心。

 

什么问题该用分治,什么问题该用动态规划,看两个因素:最优子结构和重叠子问题。

有这两个因素,用动态规划就对了。

重叠子问题前面说了,那什么是最优子结构呢?

当问题的最优解包含了其子问题的最优解时,则称该问题具有最优子结构性质。

举个栗子,斐波那契数列Fibonacci中,f(4)=f(3)+f(2),而它的解就包含在其子问题f(3)跟f(2)中,这就是所说的,问题的最优解包含在子问题的最优解中。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值