网站大量收购独家精品文档,联系QQ:2885784924

算法设计与分析动态规划.ppt

  1. 1、本文档共247页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
要统计计算fib(n)需要递归调用fibonacci函数的次数,只要增加一个全局变量即可。 Num=0; int fibonacci(int n) {Num++; if (n = 1) return 1; return fibonacci(n-1)+fibonacci(n-2); } 如果我们调用fib(5),将产生一棵对于同一值重复计算多次的调用树: fib(5) fib(4) + fib(3) (fib(3) + fib(2)) + (fib(2) + fib(1)) ((fib(2) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1)) (((fib(1) + fib(0)) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1)) 特别是,fib(2)计算了3次。在更大规模的例子中,还有更多fib的值被重复计算,将消耗指数级时间。 从上图可知,同一个值被计算了多次,如fib(3)计算了3次,fib (2)计算了5次,也就是说随着程序的运行,进行了很多冗余的计算,也就是计算那些已经知道答案的值,这就产生了重叠,相互之间共享了一些数据,实际上,它们之间共享了很多数据。这种情况很普遍。解决的方法之一是(称为memoization方法或缓存方法) :在第一次计算出函数值时就把值记下,然后以后需要时进行查找。这种方法在知道会重复使用某个值时很有用。 用这种方法求fib(6)只要调用函数11次。 Fib(30)=1346269 Fib(30)=59 (缓存方法) 该方法的具体做法是设置一个全局数组A[N+1],初始值都为0; 对每个I,其A[i]为0表示它的值还没计算出来。 /*备忘录方法求解斐波那契数列, 首先去查是否已经被计算出来 过,如果已经计算出来了(其值大于0),则不递归求解其值 ,直 接返回其值即可,否则(其值为0)递归求解其值 */ #include stdio.h其值 #define N 6 int a[N+1],num; int fac(int n) {num++; if (a[n]0) return a[n]; else { if (n=1) a[n]=1; else a[n]=fac(n-1)+fac(n-2); return a[n]; } } void main() {fac(N); printf(%d %d,a[N],num); } 动态规划通常采用以下两种方式中的一种两个办法: 自顶向下:将问题划分为若干子问题,求解这些子问题并保存结果以免重复计算。该方法将递归和缓存结合在一起。 如上例 自下而上:先行求解所有可能用到的子问题,然后用其构造更大问题的解。该方法在节省堆栈空间和减少函数调用数量上略有优势,但有时想找出给定问题的所有子问题并不那么直观。 斐波纳契数列F(n) 递归 vs 动态规划 方法概要 构造一个公式,它表示一个问题的解是与它的子问题的 解相关的公式. E.g. F(n) = F(n-1) + F(n-2). 为这些子问题做索引 ,以便它们能够在表中更好的存储与检索 (i.e., 数组array【】) 以自底向上的方法来填写这表格; 首先填写最小子问题的解. 这就保证了当我们解决一个特殊的子问题时, 可以利用比它更小的所有可利用的 子问题的解. 动态规划算法 算法思想 将待求解的问题分解成若干个子问题,并存储子问题的解而避免计算重复的子问题,并由子问题的解得到原问题的解。 动态规划算法通常用于求解具有某种最优性质的问题。 动态规划算法的基本要素: 最优子结构性质和重叠子问题。 最优子结构性质:问题的最优解包含着它的子问题的最优解。即不管前面的策略如何,此后的决策必须是基于当前状态(由上一次决策产生)的最优决策。 重叠子问题:在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些问题被反复计算多次。对每个子问题只解一次,然后将其解保存起来,以后再遇到同样的问题时就可以直接引用,不必重新求解。 动态规划 动态规划算法的4个步骤: 1. 刻画最优解的结构特性. (一维,二维,三维数组) 2. 递归的定义最优解. (状态转移方程) 3. 以自底向上的方法来计算最优解. 4. 从计算得到的解来构造一个最优解. 例题一. 斐波纳契数列F(n) 例题二. 输入n,求出n! 每一种完全加括号的方式对应于一个矩阵连乘积的计算次序,这决定着作乘积所需要的计算量。若A是一个p×q矩阵,B是一个q×r矩阵,则计算其乘积C=AB的

文档评论(0)

小教资源库 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档