第5章递归与分治略冯2010.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文档。上传文档
查看更多
第5章递归与分治略冯2010

Divide and Conquer Method 第5章 递归与分治策略法 Divide and Conquer Method 冯思玲 海南大学信息科学技术学院 College of Information Science and Technology, Hainan University lily85161@163.com 课程目录 第1章 算法引论(6学时) 第2章 常用数学工具(3学时) 第3章 NP完全性理论(4.5学时) 第4章 蛮力法(3学时) 第5章 递归与分治策略(3学时) 第6章 减冶法(3学时) 第7章 动态规划(3学时) 第8章 贪心算法(4.5学时) 第9章 回溯法(4.5学时) 第10章 分支限界法(4.5学时) 第11章 概率算法(4.5学时) 第12章 近似算法(3学时) 总复习 (3学时) 讨论 a^n的蛮力法计算复杂度为O(n),因为: …… a=1; For (i=1; i=n;i++) {a=a*a;} …… A^n的通用分治递推式主定理(第一章中),其复杂度为O(nlog2n) 递归的概念 直接或间接地调用自身的算法称为递归算法(Recursion)。用函数自身给出定义的函数称为递归函数。是一种描述问题和解决问题的基本方法。 由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。 递归的概念 分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。 递归有两个基本要素: ⑴ 边界条件:确定递归到何时终止; ⑵ 递归模式:大问题是如何分解为小问题的。 递归的几个实例 递归的概念 例1 阶乘( Factorial )函数 阶乘函数可递归地定义为: 递归的概念 递归的概念 例2 Fibonacci斐波纳契兔子数列 无穷数列1,1,2,3,5,8,13,21,34,55,…,被称为Fibonacci数列。它可以递归地定义为: 递归的概念 例3 整数划分问题 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 其中:n1≥n2≥…≥nk≥1,k≥1 正整数n的这种表示称为正整数n的划分。求正整数n的不 同划分个数。例如正整数6有如下11种不同的划分: 6; 5+1; 4+2;4+1+1; 3+3;3+2+1;3+1+1+1; 2+2+2;2+2+1+1;2+1+1+1+1; 1+1+1+1+1+1 所以,6的划分数记为:p(6)=11 递归小结 优点: 结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。 缺点: 递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。 递归小结-分治法适用条件 分治法所能解决的问题一般具有以下几个特征: 该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质 利用该问题分解出的子问题的解可以合并为该问题的解; 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 递归小结-分治法基本步骤 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,...,yk); //将各子问题的解合并为原问题的解 } 人们从大量实践中发现,在用分治法设计算法时,最好使子问题的规模大致相同。即将一个问题分成大小相等的k个子问题的处理方法是行之有效的。这种使子问题规模大致相等的做法是出自一种平衡(balancing)子问题的思想,它几乎总是比子问题规模不等的做法要好。 // 覆盖右上角子棋盘 if (dr tr + s dc = tc + s) // 特殊方格在右上角子棋盘中 ChessBoard(tr, tc+s, dr, dc, s); //递归处理子棋盘 else {

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档