第四章-递归和分治-算法设计与分析课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第四章-递归和分治-算法设计与分析课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第四 递归 分治 算法 设计 分析 课件
- 资源描述:
-
1、1第四章第四章 递归和分治递归和分治 4.1 基于归纳的递归算法基于归纳的递归算法 4.2 分治法分治法 24.1 基于归纳的递归算法基于归纳的递归算法 一一 基于归纳的递归算法的思想方法基于归纳的递归算法的思想方法 二二 递归算法的例子递归算法的例子 三三 排列问题的递归算法排列问题的递归算法 四四 求数组主元素的递归算法求数组主元素的递归算法 五五 整数划分问题的递归算法整数划分问题的递归算法 3一一 归纳法的思想方法归纳法的思想方法解规模为解规模为 n 的问题的问题 P(n):1.基础步:基础步:是问题是问题 P(1)的解的解2.归纳步:对所有的归纳步:对所有的 k,1 k n,若,若
2、是问题是问题 P(k)的的 解,则解,则 是问题是问题 P(k+1)的解,其中,的解,其中,是对是对 的某种运算或处理的某种运算或处理为求问题为求问题 P(n)的解的解 ,先求问题,先求问题 P(n 1)的解的解 ,再对,再对 进行进行 运算或处理,得到运算或处理,得到为求问题为求问题 P(n 1)的解的解 ,先求问题,先求问题 P(n 2)的解的解 再进行再进行 运算或处理,得到运算或处理,得到如此等等,不断地进行递归求解,直到如此等等,不断地进行递归求解,直到 P(1)的解的解 为止为止当得到当得到 P(1)的解之后,再回过头来,不断地把所得到的解的解之后,再回过头来,不断地把所得到的解进
3、行进行 p 运算或处理,直到得到运算或处理,直到得到 P(n)的解为止的解为止 ka)a(pk)a(pkka1ana-1na-1na)a(p-1nna-1na2-na)a(p2-n-1na1a4二二 递归算法的例子递归算法的例子1.计算阶乘函数计算阶乘函数 n!阶乘函数可归纳定义为阶乘函数可归纳定义为 递归算法如下:递归算法如下:1.int factorial(int n)2.3.if(n=0)4.return 1;5.else 6.return n*factorial(n-1);7.0!)1(01!nnnnn5二二 递归算法的例子递归算法的例子1.计算阶乘函数计算阶乘函数 n!算法的时间复杂
4、性可由如下递归方程确定:算法的时间复杂性可由如下递归方程确定:解此方程,有:解此方程,有:1)1()(0)0(nfnff)()(nnnf6二二 递归算法的例子递归算法的例子2.基于递归的插入排序基于递归的插入排序 对对 n 个元素的数组进行排序个元素的数组进行排序 1)基础步:当)基础步:当 n=1 时,数组只有一个元素,它已经是排时,数组只有一个元素,它已经是排 序的;序的;2)归纳步:如果前面)归纳步:如果前面 k-1 个元素已经按递增顺序排序,只个元素已经按递增顺序排序,只 要对第要对第 k 个元素逐一与前面个元素逐一与前面 k-1 个元素比较,把它插入个元素比较,把它插入 适当的位置,
5、即可完成适当的位置,即可完成 k 个元素的排序个元素的排序 7二二 递归算法的例子递归算法的例子2.基于递归的插入排序基于递归的插入排序 算法描述:算法描述:1.template 2.void insert_sort_rec(Type A,int n)3.4.int k;5.Type a;6.n=n 1;8二二 递归算法的例子递归算法的例子2.基于递归的插入排序基于递归的插入排序 算法描述:算法描述:7.if(n0)8.insert_sort_rec(A,n-1);9.a=An;10.k=n 1;11.while(k=0)&(Aka)12.Ak+1=Ak;13.k=k-1;14.15.Ak+1
6、=a;16.17.9二二 递归算法的例子递归算法的例子2.基于递归的插入排序基于递归的插入排序 算法的时间复杂性可由如下递归方程确定算法的时间复杂性可由如下递归方程确定 容易得到:容易得到:因此,算法的时间复杂性是因此,算法的时间复杂性是)1()1()(0)0(nnfnff)1(21)1()(111nniinfnini)(2nO10二二 递归算法的例子递归算法的例子3.整数羃的计算整数羃的计算 计算以计算以 x 为底的为底的 n 次羃,简单的方法是让次羃,简单的方法是让 x 乘以自身乘以自身 n 次。次。但效率低,需要但效率低,需要(n)个乘法。下面算法可以用个乘法。下面算法可以用(logn)
7、来实现它。来实现它。1.int power(int x,int n)2.3.int y;4.if(n=0)y=1;5.else 6.y=power(x,n/2);7.y=y*y;8.if(n%2=1)9.y=y*x;10.11.return y;12.11二二 递归算法的例子递归算法的例子3.整数羃的计算整数羃的计算 第第 7 行的乘法作为算法的基本操作,时间复杂性估计如下行的乘法作为算法的基本操作,时间复杂性估计如下 设设 ,把上式改写成,把上式改写成 有:有:1)2/()(1)1(nfnffkn2)2()(kfkg1)1()(1)0(kgkgg)log(1log1)()(nnkkgnf12
8、二二 递归算法的例子递归算法的例子4.多项式求值的递归算法多项式求值的递归算法 n 阶多项式:阶多项式:1)基础步:)基础步:n=0,有,有 ;2)归纳步:对任意的)归纳步:对任意的 k,1kn,如果前面,如果前面 k-1 步已计步已计 算出算出 ,则有:,则有:把把 存放于存放于 A0,存放于存放于 A1,如此等等,如此等等 0111)(axaxaxaxPnnnnn01321)(axaxxaxaxaxannnnnap01kpknkkapxp1na1na13二二 递归算法的例子递归算法的例子4.多项式求值的递归算法多项式求值的递归算法 1.float horner_pol(float x,fl
9、oat A,int n)2.3.float p;4.if(n=0)5.p=A0;6.else 7.p=horner_pol(x,A,n-1)*x+An;8.return p;9.14二二 递归算法的例子递归算法的例子4.多项式求值的递归算法多项式求值的递归算法 把第把第7行的乘法作为基本操作,算法的时间复杂性由如下的行的乘法作为基本操作,算法的时间复杂性由如下的 递归方程确定:递归方程确定:可得:可得:1)1()(0)0(nfnff)()(nnf15三三 排列问题的递归算法排列问题的递归算法 1.排列问题递归算法的思想方法排列问题递归算法的思想方法 2.排列问题递归算法的描述排列问题递归算法的
10、描述 3.排列问题递归算法的求解过程排列问题递归算法的求解过程 161.排列问题递归算法的思想方法排列问题递归算法的思想方法存放于数组存放于数组 A 的的 n 个元素,生成其排列的步骤:个元素,生成其排列的步骤:1)第一个元素不动,生成后面)第一个元素不动,生成后面 n 1 个元素的排列个元素的排列2)第一、第二个元素互换,生成后面)第一、第二个元素互换,生成后面 n 1 个元素的排列个元素的排列3)最后,第一个、第)最后,第一个、第 n 个元素互换,生成后面个元素互换,生成后面 n 1 个元个元 素的排列;素的排列;为生成后面为生成后面 n 1 个元素的排列,继续采取下面的步骤:个元素的排列
11、,继续采取下面的步骤:1)第二个元素不动,生成后面)第二个元素不动,生成后面 n 2 个元素的排列个元素的排列2)第二、第三个元素互换,生成后面)第二、第三个元素互换,生成后面 n 2 个元素的排列个元素的排列3)最后,第二个、第)最后,第二个、第 n 个元素互换,生成后面个元素互换,生成后面 n 2 个元个元 素的排列;素的排列;17排列问题递归算法的思想方法(续)排列问题递归算法的思想方法(续)当排列的前当排列的前 n 2 个元素确定后,为生成后面个元素确定后,为生成后面 2 个元素的排列,个元素的排列,可以:可以:1)第)第 n 1 个元素不动,生成后面个元素不动,生成后面 1 个元素的
12、排列,此时个元素的排列,此时 n 个元素已构成一个排列;个元素已构成一个排列;2)第)第 n-1、第、第 n 个元素互换,生成后面个元素互换,生成后面 1 个元素的排列,个元素的排列,此时,此时,n 个元素已构成一个排列;个元素已构成一个排列;令排列算法令排列算法 perm(A,k,n)表示生成数组后面表示生成数组后面 k 个元素的列。个元素的列。有:有:1)基础步:)基础步:k=1,只有一个元素,已构成一个排列;,只有一个元素,已构成一个排列;2)归纳步:对任意的)归纳步:对任意的 k,1 k n,为完成,为完成 perm(A,k,n),逐一对第逐一对第 n k,与第与第 n k n 元素进
13、行互换,每互换一元素进行互换,每互换一 次,就执行一次次,就执行一次 perm(A,k-1,n)操作,产生一个排列操作,产生一个排列 182.排列问题递归算法的描述排列问题递归算法的描述 2.void perm(Type A,int k,int n)3.int i;5.if(k=1)6.for(i=0;in;i+)/已构成一个排列已构成一个排列,输出它输出它 7.cout A i;8.else 9.for(i=n-k;in;i+)/生成后续的一系列排列生成后续的一系列排列 10.swap(A i,A n-k);11.perm(A,k-1,n);12.swap(A i,A n-k);13.14.
14、15.193.排列问题递归算法的求解过程排列问题递归算法的求解过程 2.void perm(Type A,int k,int n)3.int i;5.if(k=1)6.for(i=0;in;i+)7.cout A i;8.else 9.for(i=n-k;in;i+)10.swap(A i,A n-k);11.perm(A,k-1,n);12.swap(A i,A n-k);13.14.15.ik 11n 33A 的的 内内 容容 123132i 1 2n k=1 k 2n 3A 的的 内内 容容 123 132 123i 0n k=0 k 3n 3A 的的 内内 容容 12320排列问题递归
15、算法的求解过程排列问题递归算法的求解过程(续(续 1)2.void perm(Type A,int k,int n)3.int i;5.if(k=1)6.for(i=0;in;i+)7.cout A i;8.else 9.for(i=n-k;in;i+)10.swap(A i,A n-k);11.perm(A,k-1,n);12.swap(A i,A n-k);13.14.15.ik 11n 33A 的的 内内 容容 213231i 1 2n k=0 k 2n 3A 的的 内内 容容 213 231 213i 1n k=0 k 3n 3A 的的 内内 容容 123 213 12321排列问题递
16、归算法的求解过程排列问题递归算法的求解过程(续(续 2)2.void perm(Type A,int k,int n)3.int i;5.if(k=1)6.for(i=0;in;i+)7.cout A i;8.else 9.for(i=n-k;in;i+)10.swap(A i,A n-k);11.perm(A,k-1,n);12.swap(A i,A n-k);13.14.15.ik 11n 33A 的的 内内 容容 321312i 1 2n k=0 k 2n 3A 的的 内内 容容 321 312 321i 2n k=0 k 3n 3A 的的 内内 容容 123 321 12322四四 求
17、数组主元素的递归算法求数组主元素的递归算法 1.求数组主元素递归算法的思想方法求数组主元素递归算法的思想方法 2.求数组主元素递归算法的描述求数组主元素递归算法的描述 3.时间复杂性估计时间复杂性估计 23 1.求数组主元素递归算法的思想方法求数组主元素递归算法的思想方法1)数组主元素:)数组主元素:A 是具有是具有 n 个元素的数组,个元素的数组,x 是是 A 中的一个元素,若中的一个元素,若 A 中有一半以上的元素与中有一半以上的元素与 x 相同,就称相同,就称 x 是数组的主元素。是数组的主元素。例:数组例:数组 A=1,3,2,3,3,4,3 中,中,元素元素 3 是该数组的主元素是该
18、数组的主元素 24 1.求数组主元素递归算法的思想方法求数组主元素递归算法的思想方法2)数组主元素性质:)数组主元素性质:移去数组中两个不同元素后,如果原来数组中有主元移去数组中两个不同元素后,如果原来数组中有主元 素,该主元素仍然是新数组的主元素。素,该主元素仍然是新数组的主元素。如果数组如果数组 2k 个元素中有个元素中有 k 个元素相同,那么,移去个元素相同,那么,移去 这这 2k 个元素后,如果原来数组中有主元素,该主元个元素后,如果原来数组中有主元素,该主元 素仍然是新数组的主元素。素仍然是新数组的主元素。对数组不断施加上述两种操作,最后将得到如下结果:对数组不断施加上述两种操作,最
19、后将得到如下结果:新数组只剩下一个元素:该元素可作为主元素的候新数组只剩下一个元素:该元素可作为主元素的候 选者。选者。新数组是若干个相同的元素:该元素可作为主元素新数组是若干个相同的元素:该元素可作为主元素 的候选者。的候选者。没剩余元素:原来数组没有主元素没剩余元素:原来数组没有主元素 25 1.求数组主元素递归算法的思想方法求数组主元素递归算法的思想方法3)思想方法:)思想方法:假定寻找主元素候选者的算法为假定寻找主元素候选者的算法为 dandidate(Type A,int n,int m)n:数组元素个数,:数组元素个数,m:数组前面被移去的元素个数,:数组前面被移去的元素个数,基础
20、步:基础步:n-m=0:没有主元素候选者:没有主元素候选者 n-m=1:Am 是主元素候选者,或者:是主元素候选者,或者:Am An-1 是同一元素:是同一元素:Am 是主元素候选者是主元素候选者 归纳步:归纳步:据性质据性质 1 移去移去 Am An+1,用,用 dandidate(A,n,m+2)寻找主元素候选者,或者:寻找主元素候选者,或者:据性质据性质2 移去移去 Am An+2k-1,k(n-m)/2,用,用 dandidate(A,n,m+2k)寻找主元素候选者。寻找主元素候选者。262.求数组主元素递归算法的描述求数组主元素递归算法的描述 2.BOLL dandidate(Typ
21、e A,Type&c,int n,int m)3.4.int j=m,count=1;5.c=Am;6.while(j0)7.j=j+1;8.if(Aj=c)count=count+1;9.else count=count 1;10.11.if(j=n-1&count0)return TRUE;12.else if(j=n-1&count=0)return FALSE;13.else return candidate(A,c,n,j+1);14.272.求数组主元素递归算法的描述求数组主元素递归算法的描述 2.BOLL majority(Type A,Type&m,int n)3.4.int
22、j,count=0,k=0;5.BOLL flag;6.flag=dandidate(A,m,n,0);7.if(flag)8.for(j=0;jn;j+)8.if(Aj=m)count+;9.if(count=n/2)flag=FALSE;10.11.return flag;12.283.时间复杂性估计时间复杂性估计majority 算法的时间复杂性由第算法的时间复杂性由第 6 行调用行调用 dandidate 所花费所花费的时间和第的时间和第 89 行的循环决定。后者的运行时间为行的循环决定。后者的运行时间为(n)。1)假定,)假定,dandidate 算法第算法第 610 行的循环体每次
23、只处理行的循环体每次只处理1 对元素,就执行第对元素,就执行第 13 行的递归调用,并假定数组元素为行的递归调用,并假定数组元素为 偶数,偶数,dandidate 算法的时间复杂性为:算法的时间复杂性为:解此递归方程,可以得到解此递归方程,可以得到 0)0(1)2()(fnfnf)(2/)(nnnf293.时间复杂性估计时间复杂性估计2)如果)如果 dandidate 算法的第算法的第 610 行的循环体每次处理行的循环体每次处理 2ki 个元素个元素 ,在递归深度为,在递归深度为 m 时,就可把寻时,就可把寻 找主元素候选者的范围由找主元素候选者的范围由 n 减少到减少到1或或0而结束递归调
24、用而结束递归调用 有有 每次递归调用时循环体中的比较次数为每次递归调用时循环体中的比较次数为 总比较次数为总比较次数为)2/,1(nkmiinkmii1212ikmimiiimkk112)12(mn)(nO30五五 整数划分问题的递归算法整数划分问题的递归算法 1.整数划分问题整数划分问题 2.递归式的推导递归式的推导 3.算法描述算法描述 311.整数划分问题整数划分问题1)用一系列正整数之和的表达式来表示一个正整数,称为整)用一系列正整数之和的表达式来表示一个正整数,称为整 数的划分。数的划分。例:例:7 可划分为:可划分为:76+15+2,5+1+14+3,4+2+1,4+1+1+13+
25、3+1,3+2+1+1,3+1+1+1+12+2+2+1,2+2+1+1+1,2+1+1+1+1+11+1+1+1+1+1+1 上述任何一个表达式都称为整数上述任何一个表达式都称为整数 7 的一个划分的一个划分 321.整数划分问题整数划分问题2)正整数)正整数 n 的不同的划分个数称为正整数的不同的划分个数称为正整数 n 的划分数,记为的划分数,记为 p(n)3)求正整数)求正整数 n 的划分数称为整数划分问题的划分数称为整数划分问题 332.递归式的推导递归式的推导1)定义两个函数:)定义两个函数:r(n,m):正整数:正整数 m 的划分中加数含的划分中加数含 m 而不含大于而不含大于 m
展开阅读全文