第2章__递归与分治策略1.ppt

  1. 1、本文档共47页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第2章 递归与分治策略 算法总体思想 将要求解的较大规模的问题分割成k个更小规模的子问题。 第2章 递归与分治策略 主要知识点: 2.1 ★递归的概念 2.2 ★分治法的基本思想 2.3 二分搜索技术 2.4 大整数的乘法 2.5 Strassen矩阵乘法 2.6 棋盘覆盖 2.7 合并排序 2.8 快速排序 递归算法:直接或间接地调用自身的算法称为递归算法。 递归函数:用函数自身给出定义的函数称为递归函数。 重要特性:函数每次调用自身时,自变量必是逐步接近边界条件给定的自变量的值,否则不能求出函数值。 例1 阶乘函数 阶乘函数可递归地定义为: 例2 Fibonacci数列 无穷数列1,1,2,3,5,8,13,21,34,55,…,被称为Fibonacci数列。它可以递归地定义为: 例3 Ackerman函数 当一个函数及它的一个变量是由函数自身定义时,称这个函数是双递归函数。 Ackerman函数A(n,m)定义如下: 例3 Ackerman函数 A(n,m)的自变量m的每一个值都定义了一个单变量函数: 定义单变量的Ackerman函数A(n)为,A(n)=A(n,n)。 定义其拟逆函数α(n)为:α(n)=min{k|A(k)≥n}。即α(n)是使n≤A(k)成立的最小的k值。 α(n)在复杂度分析中常遇到。对于通常所见到的正整数n,有α(n)≤4。但在理论上α(n)没有上界,随着n的增加,它以难以想象的慢速度趋向正无穷大。 例4 排列问题 设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。 例4 排列问题算法 输入:列表list[0,n]; 输出:将列表list[k,m]中元素进行全排列,并输出排列后的所有n个元素。 算法描述: perm(list,k,m) 过程:perm(list,k,m) 例5 整数划分问题 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。 正整数n的这种表示称为正整数n的划分。求正整数n的不同划分个数。 例6 Hanoi塔问题 设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,…,n,现要求将塔座a上的这一叠圆盘移到塔座b上,并仍按同样顺序叠置。 在移动圆盘时应遵守以下移动规则: 递归小结 优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。 缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。 分治法的适用条件 该问题的规模缩小到一定的程度就可以容易地解决; 分治法的基本步骤: 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); //将各子问题的解合并为原问题的解 } 人们从大量实践中发现,在用分治法设计算法时,最好使子问题的规模大致相同。是出自一种平衡(balancing)子问题的思想,它几乎总是比子问题规模不等的做法要好。 分治法的复杂性分析: 循环赛日程表 课后作业 分治法所能解决的问题具有哪些特征? 扩展汉诺塔问题:如果塔的个数变为a,b,c,d四个,现要将n个圆盘从a全部移动到d,移动规则不变,求移动步数最小的方案。 熟悉采用分治法求解大整数乘法和矩阵乘法的基本过程。 通过棋盘覆盖问题理解算法的递归调用过程。 编写程序实现合并排序算法MergeSort和快速排序算法qSort。 A和B的乘积矩阵C中的元素C[i,j]定义为:  若依此定义来计算A和B的乘积矩阵C,则每计算C的一个元素C[i][j],需要做n次乘法和n-1次加法。因此,算出矩阵C的 个元素所需的计算时间为O(n3) 传统方法:O(n3) 2.5 Strassen矩阵乘法 使用与上例类似的技术,将矩阵A,B和C中每一矩阵都分块成4个大小相等的子矩阵。由此可将方程C=AB重写为: 传统方法:O(n3) 分治法: 由此可得: 复杂度分析 T(n)=O(n3) ?没有改进? 2.5 Strassen矩阵乘法 传统方法:O(n3) 分治法: 为了降低时间复杂度,必须减少乘法的次数。

文档评论(0)

精华文档888 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档