计算机算法设计_第二章.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
计算机算法设计_第二章

计算机算法设计 与分析 第二章 递归与分治策略 引言 引言 分治法:将一个难以直接解决的大问题分割成一些规模较小的相同问题,以便各个击破,分而治之。 注意:要保证分割出来的小问题每个都可解! 2.1 递归的概念 递归算法:直接或间接的调用自己的算法。 2.1 递归的概念 优点: 符合人们解决问题的习惯。 有些数据结构本身具有递归的特性,二叉树。 使算法简洁,容易理解和分析。 2.1 递归的概念 例2-1 阶乘函数 int fac(int n) { if(n==0) return 1; return n*fac(n-1); } 2.1 递归的概念 例2-1 Fibonacci数列 2.1 递归的概念 注意:并非一切递归函数都可以用非递归方式定义。 双递归函数(函数及它的一个变量是由函数自身定义的)——Ackerman函数。 2.1 递归的概念 ——排列 记R={r1,r2,…,rn}是要排列的n个元素;如:R={1,2,3} Ri=R-{ri},如: R1=R-{r1}=R-{1}={2,3} Perm(X)表示X集合中的元素全排列。如: Perm(R) ( ri)Perm(X)表示在每个排列前加上一个前缀ri , 如: (r1)Perm(R1) 2.1 递归的概念 ——排列 排列问题: 当n=1时,Perm(R)=(r),其中r是集合R中唯一的元素; 当n=2时, Perm(R)由(r1) Perm(R1),…, (rn) Perm(Rn)构成。 2.1 递归的概念 —— 整数划分 将正整数n表示成一系列正整数之和, 正整数n的这种表示称为正整数n的划分。 正整数n的不同的划分个数成为正整数的划 分数,记作p(n)。 例如:p(6) 2.1 递归的概念 —— 整数划分 q(n,m)表示正整数n的所有不同划分中,最大 加数t不超过m的划分个数。例如:q(6,4) q(n,1)=1,n=1 q(n,m)=q(n,n), m=n q(n,n)=1+q(n,n-1) q(n,m)=q(n,m-1)+q(n-m,m),nm1 2.1 递归的概念 —— 整数划分 int q(int n,int m) { if((n1)||(m1)) return 0; if((n==1)||m==1) return 1; if(nm) return q(n,n); if(n==m) return q(n,m-1)+1; return q(n,m-1)+q(n-m,m); } 2.1 递归的概念 Hanoi塔问题 2.1 递归的概念 递归调用会建立递归调用工作栈。 一个算法调用另一个算法,系统需在调用之前完成: 将所有实参指针、返回地址等信息传递给调用算法。 为被调用算法的局部变量分配存储空间。 将控制转移到被调用算法的入口。 2.1 递归的概念 返回需要完成: 保存被调用算法的计算结果。 释放分配给被调用算法的数据区。 依照被调用算法保存的返回地址将控制转移到原算法。 2.1 递归的概念 当有多个算法嵌套调用时,按照后调用先返回的原则进行。 根据调用的特点,所以用栈来存放调用的数据和信息。在每发生一次调用就需要在栈顶分配一个存储区,退出则释放。当前运行的算法一定在栈顶。 2.1 递归的概念 递归层次:调用一个递归算法的主算法为第0层算法,则第一次调用为第1层,以此类推。 递归调用工作栈的使用情况见P14。 递归调用的缺点:耗时耗空间。 2.2 分治法的基本思想 分治法的基本思想:将一个规模为n的 问题分解为k个规模较小的问题,这些问 题相互独立且与原问题相同。递归地解 这些问题,然后将各子问题的解合并得 到原来问题的解。 2.2 分治法的基本思想 divide –and-conquer(P) { if(|P|=n0) adhoc(P); divide P into smaller subinstances P1,P2,…,Pk; for(i=1;i=k;i++) yi=divide-and-conquer(Pi); return merge(y1,y2,…,yk); } 其中,|P|表示问题的规模,n0为一阈值, adhoc(P)是 分治法中的基本子算法, merge(y1,y2,…,yk)合并算法。 2.2 分治法的基本思想 分治法的关键:分割成多少个子问题比较合适? 从实践中发现,最好是子问题的规模大致相同。 而且要求子问题与原问题相同,只是规模小

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档