《递归与分治》PPT课件.ppt
《《递归与分治》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《递归与分治》PPT课件.ppt(117页珍藏版)》请在三一办公上搜索。
1、 2005,第2章 递归与分治策略,几个例子2.1 递归的概念2.2 分治法的基本思想2.3 分治法的应用本章小结,2,几个例子,称球游戏给定n个球,其中一个球为次品。次品在外表上与正常球无区别,但重量有分别(可能偏重或偏轻)。现在给一个天平,问:需要称几次才能将次品甄别出来?募捐问题向贫困山区儿童募捐10,000元。世界杯足球赛全球200多支球队里,选出最好的。,分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。凡治众如治寡,分数是也。-孙子兵法,3,2.1 递归的概念,例1:阶乘函数 阶乘函数可递归地定义为:,注意:(1)边界条件与递归方
2、程是递归函数的二个要素,递归函数只有具备了这两个要素,才能在有限次计算后得出结果。(2)非递归定义:,4,2.1 递归的概念,例2:Fibonacci数列问题引入裴波那契(Fibonacci leonardo,约1170-1250)是意大利著名数学家在他的著作算盘书中许多有趣的问题,最富成功的问题是著名的“兔子繁殖问题”:如果每对兔子每月繁殖一对子兔,而子兔在出生后第二个月就有生殖能力,试问一对兔子一年能繁殖多少对兔子?问题分析,5,2.1 递归的概念,6,2.1 递归的概念,数列的特点(1)数列的增长速度(2)自然科学中的若干实例(3)构造一个新数列,7,定义:,2.1 递归的概念,8,2.
3、1 递归的概念,如何求解?解法1:O(0.618n)int fib(int n)if(n=0)|(n=1)return n;return fibonacci(n-1)+fibonacci(n-2);解法2:O(n)解法3:O(logn),fib(110):O(0.618n)1022 次运算 O(n)111 次运算 O(logn)7 次运算,9,2.1 递归的概念,思考:楼梯问题有一楼梯共有n阶,上楼可以一步上一阶,也可以一步上两阶。编一个程序,计算共有多少种不同的走法?,10,例3 Ackerman函数 当一个函数及它的一个变量是由函数自身定义时,称这个函数是双递归函数。Ackerman函数A
4、(n,m)定义如下:,2.1 递归的概念,11,2.1 递归的概念,Ackerman函数A(n,0)n+2A(n,1)2nA(n,2)2n。A(n,4)的增长速度非常快,以至于没有适当的数学式子来表示这一函数。,12,2.1 递归的概念,例4 排列问题设计一个递归算法生成n个元素r1,r2,rn的全排列。设R=r1,r2,rn是要进行排列的n个元素,Ri=R-ri。集合X中元素的全排列记为perm(X),(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀得到的排列。,13,2.1 递归的概念,R的全排列可归纳定义如下:当n=1时,perm(R)=(r),其中r是集合R中唯一
5、的元素;当n1时,perm(R)由:(r1)perm(R1)(r2)perm(R2)(rn)perm(Rn)构成。参考算法:,14,2.1 递归的概念,例5 整数划分问题将一个正整数n表示成形如下式的一系列正整数的和,称为n的一个划分。形如:nn1n2nk其中:(ni1,i1,2,k,k1)且 nn1n2nk 1,15,2.1 递归的概念,例如:整数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;,16,2.1 递归的概念,分析:将最大加数n1不大于m的划分个数记作q(n,m)(1)
6、q(n,1)=1,n1;(2)q(n,m)=q(n,n),mn;最大加数n1实际上不能大于n。因此,q(1,m)=1。(3)q(n,n)=1+q(n,n-1);正整数n的划分由n1=n的划分和n1 n-1的划分组成。(4)q(n,m)=q(n,m-1)+q(n-m,m),nm1;正整数n的最大加数n1不大于m的划分由n1=m的划分和n1 m-1 的划分组成。,17,而:正整数n的划分数p(n)=q(n,n)。,2.1 递归的概念,因此:q(n,m)的递归定义如下,18,2.1 递归的概念,例6 Hanoi塔问题问题描述:,19,问题分析:,2.1 递归的概念,Hanoi(n,A,B,C),圆盘
7、数 源柱 辅助柱 目标柱,20,=,+,+,2.1 递归的概念,21,递归求解void hanoi(int n,int a,int b,int c)if(n 0)hanoi(n-1,a,c,b);move(a,b);hanoi(n-1,c,b,a);递归函数的运行轨迹,2.1 递归的概念,22,Hanio(3,A,B,C),Hanio(2,A,C,B),Hanio(1,A,B,C),Move(A,C),Move(A,B),Hanio(1,C,A,B),Move(C,B),Move(A,C),Hanio(2,B,A,C),Hanio(1,B,C,A),Move(B,C),Hanio(1,A,B,
8、C),Move(A,C),Move(B,A),23,分析:规模为n的Hanoi(n)问题,可以分解为2个规模为n-1的Hanoi(n-1)问题和一个Move 操作。所以,n个盘子的移动次数为,2.1 递归的概念,若n=64,则移动次数为264-1,264118,446,744,073,709,551,615,24,2.1 递归的概念,264118,446,744,073,709,551,615是个什么概念?实例1:假设每秒钟移动一次,一年约31556926秒,计算表明:移动64个盘子需要5800多亿年。实例2:国王的麦子问题一个高4米、宽10米的粮仓装麦子,这个粮仓有3000万公里长,能绕地球
9、赤道700圈,可以把地球全部表面(包括海洋)铺上2米厚的小麦层!它相当于全世界两千多年小麦产量的总和,25,广义hanoi问题问题描述算法分析,Hanoi(n,A,B,C,D),圆盘数 源柱 辅助柱 目标柱,2.1 递归的概念,26,2.1 递归的概念,递归的优点和缺点优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。,27,2.1 递归的概念,28,2.1 递归的概念,消除递归的方法采用一个用户定义的栈来模拟系统的递归调用工作栈。该方法通用性强,但本
10、质上还是递归,只不过人工做了本来由编译器做的事情,优化效果不明显。用递推来实现递归函数。通过变换能将一些递归转化为尾递归,从而迭代求出结果。注意:后两种方法在时空复杂度上均有较大改善,但其适用范围有限。,29,分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。凡治众如治寡,分数是也。-孙子兵法,2.2 分治法的基本思想,30,2.2 分治法的基本思想,分治法所能解决的问题一般具有以下几个特征:该问题的规模缩小到一定的程度就可以容易地解决;该问题可以分解为若干个规模较小的相同问题,且各个子问题是相互独立的,即子问题之间不包含公共的子问题。利用该
11、问题分解出的子问题的解可以合并为该问题的解;,31,2.2 分治法的基本思想,分治法(Divide and Conquer)的基本思想:分解(Divide):将一个规模为n的问题,分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同。求解(Conquer):若子问题规模较小而容易被解决则直接解,否则递归地解这些子问题。合并(Merge):将各个子问题的解合并得到原问题的解。,32,2.2 分治法的基本思想,分治法的 设计模式divide-and-conquer(P)if(|P|=n0)adhoc(P);/解决小规模的问题 divide P into smaller subinsta
12、nces P1,P2,.,Pk;/分解问题 for(i=1;i=k;i+)/递归的解各子问题 yi=divide-and-conquer(Pi);return merge(y1,.,yk);/将各子问题的解合并/为原问题的解,33,2.2 分治法的基本思想,启发式规则:平衡子问题:在用分治法设计算法时,最好使子问题的规模大致相同。也就是将一个问题划分成大小相等的k个子问题(通常k2),这种使子问题规模大致相等的做法是出自一种平衡(Balancing)子问题的思想,它几乎总是比子问题规模不等的做法要好。独立子问题:各子问题之间相互独立,这涉及到分治法的效率,如果各子问题不是独立的,则分治法需要重
13、复地解公共的子问题。,34,2.2 分治法的基本思想,分治法的典型情况,35,分治法的时间复杂性分析,通过迭代法求得方程的解:,2.2 分治法的基本思想,36,例:二分搜索技术,问题提出:给定已按升序排好序的n个元素a0:n1,现要在这n个元素中找出一特定元素x。分析:,37,2.3 分治法的应用,数值计算问题中的分治法组合问题中的分治法排序问题中的分治法几何问题中的分治法,38,应用专题一,数值计算问题中的分治法大数及其存储大整数的乘法strassen矩阵乘法,39,大数及其存储,大数计算机存储数据是按类型分配空间的。例如:在微型机上,40,大数的存储方案数组数值数组从计算的方便性考虑,决定
14、将数据是由低到高还是由高到低存储到数组中;可以每位占一个数组元素空间,也可几位占一个数组元素空间。字符型数组从键盘输入要处理的高精度数据,无需对高精度数据进行分段输入,但计算是需要类型转换的操作。,大数及其存储,41,大数及其存储,大数的运算加法减法乘法100!=93 326215 443944 152681 699263 856266 700490 715968 264381 621468 592963 895217 599993 229915 608914 463976 156578 286253 697920 827223 758251 185210 916864 000000 0000
15、00 000000 000000除法,42,问题描述:设X和Y都是n位的二进制整数,请设计一个有效的算法,可以进行两个n位大整数的乘法运算。分析:1.小学的方法:O(n2)效率太低,大整数的乘法,43,2.可以用分治法的原理设计一个更有效的算法。将n位的二进制整数分为2段:,则:X=A2n/2+B(乘2n/2,相当于左移n/2位)Y=C2n/2+D于是:XY=(A2n/2+B)(C2n/2+D)=AC2n+(AD+BC)2n/2+BD(1),大整数的乘法,44,大整数的乘法,效率:4次n/2位整数乘法(AC,AD,BC,BD);3次不超过n位整数加法;2次移位(分别对应乘以2n和2n/2)所有
16、加法和移位共用O(n)步计算。,时间复杂性分析T(n)=O(n2)没有改进,45,时间复杂性分析 T(n)=O(nlog3)=O(n1.59)较大的改进,大整数的乘法,改进:把(1)式稍作修改:XY=AC2n+(AB)(DC)+AC+BD)2n/2+BD(2)效率:3次n/2位整数乘法(AC,BD,(AB)(DC);6次不超过n位整数加、减法和2次移位;,46,大整数的乘法,Char*Mult(char X,char Y,int n)/两个n位整数相乘 S=sign(X)*sign(Y);/取乘积的符号 X=abs(X);Y=abs(Y);if(n=1)return(S*X*Y);else A
17、=X的左边n/2位;B=X的右边n/2位;C=Y的左边n/2位;D=Y的右边n/2位;m1=Mult(A,C,n/2);m2=Mult(A-B,D-C,n/2);m3=Mult(B,D,n/2);S=S*(m1*2n+(m1+m2+m3)*2n/2+m3);return S;,注意:该算法可改为十进制数乘法,只需将基数2变为10,即:2n 10n,2n/2 10n/2,47,大整数的乘法,分析传统的方法:O(n2)效率太低分治法:O(n1.59)较大的改进更快的方法?对于大整数乘法,它能在O(nlogn)时间内解决。是否能找到线性时间的算法?目前为止还没有结果。,48,strassen矩阵乘法
18、,矩阵乘法问题描述AnnBnn=Cnn求解方法传统方法:O(n3)分治法O(n2.81)O(n2.376),49,分治法将矩阵A,B和C中每一矩阵都分块成4个大小相等的子矩阵,每个子矩阵都是n/2n/2的方阵。由此可将方程C=AB重写为:,由此可得:,strassen矩阵乘法,50,为了降低时间复杂度,必须减少乘法的次数。Strassen矩阵乘法,strassen矩阵乘法,51,验证:C22=M5+M1-M3-M7=(A11+A22)(B11+B22)+A11(B12-B21)-(A21+A22)B11-(A11-A21)(B11+B12)=A11B11+A11B22+A22B11+A22B2
19、2+A11B12-A11B22-A21B11-A22B11-A11B11-A11B12+A21B11+A21B12=A21B12+A22B22,strassen矩阵乘法,52,strassen矩阵乘法,53,完整的Strassen算法如下:STRASSEN(n,A,B,C)if(n=2)MATRIX-MULTIPLY(A,B,C);/普通2*2矩阵相乘 else/将矩阵A和B分块;STRASSEN(n/2,A11,B12-B22,M1);STRASSEN(n/2,A11+A12,B22,M2);STRASSEN(n/2,A21+A22,B11,M3);STRASSEN(n/2,A22,B21-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 递归与分治 递归 分治 PPT 课件
链接地址:https://www.31ppt.com/p-4878670.html