[理学]《算法设计与分析》第05章课件(PPT 103页).pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《[理学]《算法设计与分析》第05章课件(PPT 103页).pptx》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 理学 算法设计与分析 理学算法设计与分析第05章课件PPT 103页 算法 设计 分析 05 课件 PPT 103
- 资源描述:
-
1、第1页,共103页。第2页,共103页。第3页,共103页。第4页,共103页。第5页,共103页。顾名思义就是分而治之。一个问题能够顾名思义就是分而治之。一个问题能够用分治法求解的要素是:第一,问题能够按照某用分治法求解的要素是:第一,问题能够按照某种方式分解成若干个规模较小、相互独立且与原种方式分解成若干个规模较小、相互独立且与原问题类型相同的子问题;第二,子问题足够小时问题类型相同的子问题;第二,子问题足够小时可以直接求解;第三,能够将子问题的解组合成可以直接求解;第三,能够将子问题的解组合成原问题的解。原问题的解。由于分治法要求分解成同类子问题,并允许不由于分治法要求分解成同类子问题,
2、并允许不断分解,使问题规模逐步减小,最终可用已知的断分解,使问题规模逐步减小,最终可用已知的方法求解足够小的问题,因此,分治法求解很自方法求解足够小的问题,因此,分治法求解很自然导致一个递归算法。然导致一个递归算法。第6页,共103页。分治法分治法SolutionType DandC(ProblemType P)ProblemType P1,P2,Pk;if(Small(P)return S(P);else Divide(P,P1,P2,Pk);Return Combine(DandC(P1),DandC(P2),DandC(Pk);第7页,共103页。一分为二的分治法一分为二的分治法Solu
3、tionType DandC(int left,int right)if(Small(left,right)return S(left,right);else int m=Divide(left,right);Return Combine(DandC(left,m),DandC(m+1,right);第8页,共103页。采用分治法求解问题通常得到一个递归算法。如果较大采用分治法求解问题通常得到一个递归算法。如果较大的问题被分解成同样大小的几部分,那么分析相应算法的的问题被分解成同样大小的几部分,那么分析相应算法的执行时间,往往可得到如下的递推关系式:执行时间,往往可得到如下的递推关系式:T(n
4、)=aT(n/b)+cnk,T(1)=c 第9页,共103页。设设a,b,c和和k为常数,为常数,T(n)=aT(n/b)+cnk,T(1)=c,则,则,kkkkkalogba )n(ba )nlogn(ba )n()n(Tb如果如果如果如果如果如果 第10页,共103页。miikmmiikimkkkmmmkkkkkkkkkkkabcabaccnbnacbncaTacnbnacbncabnTacnbnacbncbnaTacnbnacbnTacnbncbnaTacnbnaTnT00112233232222)/()/()/()1()/()/()/()/()/()/()/()/()/()/()/()
5、(第11页,共103页。设设r=bk/a,下面分三种情况计算,下面分三种情况计算。(1)若)若r1,则,则 所以所以 )r1/(1rm0ii )(nT(n)alogb nlog1m1r bm0ii )nlogn()nlog(nT(n)kalogb )r(1r1rr m1mm0ii )n()b()r(aT(n)kmkmm 第12页,共103页。kkkkkalogba )n(ba )nlogn(ba )n()n(Tb如如果果如如果果如如果果 第13页,共103页。template struct E/可排序表中元素的类型可排序表中元素的类型operator K()const return key;/
6、重载类型转换运算符重载类型转换运算符K key;/关键字可以比较大小关键字可以比较大小D data;/其他数据其他数据;第14页,共103页。class SortableList /可排序表类可排序表类 public:SortableList(int mSize)/构造函数构造函数 maxSize=mSize;l=new TmaxSize;n=0;SortableList()delete l;/析构函数析构函数 private:T*l;/定义动态一维数组定义动态一维数组int maxSize;/线性表的最大表长线性表的最大表长int n;/线性表的实际长度线性表的实际长度;第15页,共103页
7、。第16页,共103页。在一个元素集合中寻找最大元素和最小元在一个元素集合中寻找最大元素和最小元素的问题。素的问题。第17页,共103页。template void SortableList:MaxMin(T&max,T&min)const if(n=0)return;max=min=l0;for(int i=1;imax)max=li;if(limin)min=li;/第18页,共103页。template void SortableList:MaxMin(T&max,T&min)const if(n=0)return;max=min=l0;for(int i=1;imax)max=li;e
8、lse if(limin)min=li;第19页,共103页。template void SortableList:MaxMin(int i,int j,T&max,T&min)const T min1,max1;if(i=j)max=min=li;else if(i=j-1)if(lilj)max=lj;min=li;else max=li;min=lj;第20页,共103页。else int m=(i+j)/2;MaxMin(i,m,max,min);MaxMin(m+1,j,max1,min1);if(maxmin1)min=min1;第21页,共103页。设有设有n个元素的表,假定个元
9、素的表,假定n是是2的幂,即的幂,即n=2k,k是是正整数,程序正整数,程序55在最好、平均和最坏情况下的比较次在最好、平均和最坏情况下的比较次数都为数都为3n/22。2n 2)2/n(T)2/n(T2n 11n 0)n(T 第22页,共103页。第23页,共103页。第24页,共103页。在有序表(已按关键字值非减排序)中搜索给在有序表(已按关键字值非减排序)中搜索给定元素的问题。定元素的问题。第25页,共103页。在范围为在范围为left,right的表中搜索与的表中搜索与x有相同关有相同关键字值的元素;如果存在该元素,则函数返回该元素在键字值的元素;如果存在该元素,则函数返回该元素在表中
10、的位置,否则函数返回表中的位置,否则函数返回1,表示搜索失败。,表示搜索失败。第26页,共103页。二分搜索的基本思想是:首先将待查值二分搜索的基本思想是:首先将待查值x与有序表与有序表l0到到ln-1的中的下标为的中的下标为mid上的上的元素进行比较,若相等,则查找成功;否则,元素进行比较,若相等,则查找成功;否则,若若xlmid,则在,则在lmid+1到到ln-1中继续中继续查找。查找。第27页,共103页。每通过一次关键字的比较,搜索区间的长度每通过一次关键字的比较,搜索区间的长度就缩小一次,如此不断进行下去,直到找到就缩小一次,如此不断进行下去,直到找到值等于值等于x的元素;的元素;若
11、当前的查找区间为空若当前的查找区间为空,表示查找失败。表示查找失败。从上述查找思想可知,每进行一次关键字比从上述查找思想可知,每进行一次关键字比较,都将原区间一分为二,故称为二分搜索。较,都将原区间一分为二,故称为二分搜索。如果把要搜索区间的长度缩小一半,就称为如果把要搜索区间的长度缩小一半,就称为对半搜索。对半搜索。第28页,共103页。template int SortableList:BSearch(const T&x,int left,int right)const if (left=right)int m=Divide(left+right);if(xlm)return BSearc
12、h(x,m+1,right);else return m;return-1;第29页,共103页。对半搜索是一种二分搜索。设当前搜索的子表对半搜索是一种二分搜索。设当前搜索的子表 为(为(aleft,aleft+1,aright),),令令 m=(left+right)/2 第30页,共103页。例如,假设给定有序表中关键字为例如,假设给定有序表中关键字为8,17,25,44,68,77,98,100,115,125,将查找,将查找K=17和和K=120的的情况描述为以下形式。情况描述为以下形式。8 17 25 44 68 77 98 10 115 125 low high (a)初始情形 8
13、 17 25 44 68 44 98 100 115 125 low high mid (b)经过一次比较后的情形 第31页,共103页。8 17 25 44 68 77 98 100 115 125(c)经过二次比较后的情形 (Rmid.key=17)low mid high 查找 K=17 的示意图(查找成功)8 17 25 44 68 77 98 100 115 125 (a)初始情形 low high 第32页,共103页。8 17 25 44 68 77 98 100 115 125 (b)经过一次比较后的情形 mid low high 8 17 25 44 68 77 98 100
14、 115 125 (c)经过二次比较后的情形 mid low high 第33页,共103页。8 17 25 44 68 77 98 100 115 125 (d)经过三次比较后的情形 mid low high 17 25 44 77 98 100 115 125 high low mid (e)经过四次比较后的情形(highlow)查找 K=120 的示意图 (查找不成功)第34页,共103页。template int SortableList:BSearch(const T&x,int left,int right)const if (left=right)int m=(left+righ
15、t)/2;if(xlm)return BSearch(x,m+1,right);else return m;return-1;第35页,共103页。为了分析二分查找的性能,可以用二叉树来描述二分查找过程。把为了分析二分查找的性能,可以用二叉树来描述二分查找过程。把当前查找区间的中点作为根结点,左子区间和右子区间分别作为根的左当前查找区间的中点作为根结点,左子区间和右子区间分别作为根的左子树和右子树,左子区间和右子区间再按类似的方法,由此得到的二叉子树和右子树,左子区间和右子区间再按类似的方法,由此得到的二叉树 称 为 二 分 查 找 的 判 定 树。例 如,对 关 键 字 序 列树 称 为 二
16、 分 查 找 的 判 定 树。例 如,对 关 键 字 序 列8,17,25,44,68,77,98,100,115,125,的判定树下图。,的判定树下图。4 4 8 2 5 1 7 9 8 7 7 6 8 1 0 0 11 5 1 2 5 图 具 有 1 0 个 关 键 字 序 列 的 二 分 查 找 判 定 树 第36页,共103页。44 8 25 17 98 77 68 100 115 125 图 具 有 10 个 关 键 字 序 列 的 二 分 查 找 判 定 树 第37页,共103页。从上图可知,查找根结点从上图可知,查找根结点68,需一次查找,查找,需一次查找,查找17和和100,各
17、需二次查找,查找各需二次查找,查找8、25、77、115各需三次查找,查各需三次查找,查找找44、98、125各需四次查找。于是,可以得到结论:二各需四次查找。于是,可以得到结论:二叉树第叉树第K层结点的查找次数各为层结点的查找次数各为k次次(根结点为第根结点为第1层层),而,而第第k层结点数最多为层结点数最多为2k-1个。假设该二叉树的深度为个。假设该二叉树的深度为h,则二分查找的成功的平均查找次数为(假设每个结点的则二分查找的成功的平均查找次数为(假设每个结点的查找概率相等):查找概率相等):第38页,共103页。ASL=1/n1/n 1/n(1+2 2+3 22+h 2h-1)=1/nn
18、iiicp1niic1hkkk112设设s=20+221+322+(h-1)2h-2+h2h-1则则2s=21+222+(h-2)2h-2+(h-1)2h-1+h2hs=2s-s=h.2h-(20+21+22+2h-2+2h-1)=h.2h-(2h-1)hkkk112第39页,共103页。ASL=1/n(log2(n+1)(2h-1+1)-n)=1/n(log2(n+1)(n+1)-n)=(n+1)/n log2(n+1)-1 =(1+1/n)log2(n+1)-1当当n很大时,很大时,ASL log2(n+1)-1 可以作为二分查找成功时的平可以作为二分查找成功时的平均查找长度,它的时间复杂
19、度为均查找长度,它的时间复杂度为 (log2n)。根据二叉树的性质,最大的结点数根据二叉树的性质,最大的结点数n=2n=2h h-1-1,h=logh=log2 2(n+1)(n+1),于是可以得到平均查找次数于是可以得到平均查找次数ASL=s/nASL=s/nASL=1/n(h2ASL=1/n(h2h h-(2-(2h h-1)-1)第40页,共103页。在一个有在一个有n个元素的集合中,通过关键字值之间的比个元素的集合中,通过关键字值之间的比较,搜索指定关键字值的元素,任意这样的算法在最坏较,搜索指定关键字值的元素,任意这样的算法在最坏情况下至少需要作情况下至少需要作 log n+1次比较
20、。次比较。第41页,共103页。第42页,共103页。排序是将一个元素序列调整为按指定关键字值的递增排序是将一个元素序列调整为按指定关键字值的递增(或递减)次序排列的有序序列。(或递减)次序排列的有序序列。第43页,共103页。合并算法排序也属于分治方法。合并(合并算法排序也属于分治方法。合并(MergeMerge)就是将)就是将两个或多个有序表合并成一个有序表,例如下图所示的两两个或多个有序表合并成一个有序表,例如下图所示的两个有序表经合并运算后得到一个有序表。我们在此只用到个有序表经合并运算后得到一个有序表。我们在此只用到两个有序表的合并,称为二路合并两个有序表的合并,称为二路合并Two-
21、way mergeTwo-way merge)。)。A 7 10 13 15 B 4 8 19 20 C 4 7 8 10 13 15 19 20 第44页,共103页。合并排序(合并排序(Merge sortMerge sort)就是利用这种合并)就是利用这种合并过程进行排序,即先将过程进行排序,即先将n n个数据看成个数据看成n n个长度为个长度为l l的的表,将相邻的表成对合并,得到长度为表,将相邻的表成对合并,得到长度为2 2的的n/2n/2个有序表;个有序表;进一步再将相邻表成对合并,得到长度为进一步再将相邻表成对合并,得到长度为4 4的的n/4n/4个有序个有序表;表;如此重复做下
22、去,直至所有数据均合并;如此重复做下去,直至所有数据均合并到一个长度为到一个长度为n n的有序表为止,即完成排序。上述的有序表为止,即完成排序。上述每一次的合并过程称为一趟每一次的合并过程称为一趟PassPass),整个排序),整个排序过程叫二路合并排序。下图是二路合并排序过程过程叫二路合并排序。下图是二路合并排序过程的一个例子。的一个例子。第45页,共103页。7 15 13 10 4 20 19 87 15 10 13 4 20 8 197 15 13 10 4 20 19 8 7 10 13 15 4 8 19 20 4 7 8 10 13 15 19 20第46页,共103页。第47页
23、,共103页。template void SortableList:Merge(int left,int mid,int right)T*temp=new Tright-left+1;int i=left,j=mid+1,k=0;while(i=mid)&(j=right)if(li=lj)tempk+=li+;else tempk+=lj+;while(i=mid)tempk+=li+;while(j=right)tempk+=lj+;for(i=0,k=left;k=right;)lk+=tempi+;第48页,共103页。将待排序的元素序列一分为二分,得到两个长度基将待排序的元素序列一分
24、为二分,得到两个长度基本相等的子序列,如同对半搜索的做法;然后对两个本相等的子序列,如同对半搜索的做法;然后对两个子序列分别排序,如果子序列较长,还可继续细分,子序列分别排序,如果子序列较长,还可继续细分,直到子序列的长度不超过直到子序列的长度不超过1 1为止;当分解所得的子序为止;当分解所得的子序列已排列有序,可以采用上面介绍的将两个有序子序列已排列有序,可以采用上面介绍的将两个有序子序列,合并成一个有序子序列的方法,实现将子问题的列,合并成一个有序子序列的方法,实现将子问题的解组合成原问题解,这是分治法不可缺少的一步。解组合成原问题解,这是分治法不可缺少的一步。第49页,共103页。对于二
展开阅读全文