第2章分治策略_第1页
第2章分治策略_第2页
第2章分治策略_第3页
第2章分治策略_第4页
第2章分治策略_第5页
已阅读5页,还剩35页未读 继续免费阅读

VIP免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,第2章分治策略(DivideandConquer),2.1分治策略的基本思想2.1.1两个熟悉的例子2.1.2分治算法的一般性描述2.2分治算法的分析技术2.3改进分治算法的途径2.3.1通过代数变换减少子问题个数2.3.2利用预处理减少递归内部的计算量2.4典型实例2.4.1快速排序算法2.4.2选择问题2.4.3n1次多项式在全体2n次方根上的求值,2,2.1.1两个熟悉的例子,二分检索算法2.1BinarySearch(T,x)输入:排好序数组T,数x输出:j/如果x在T中,j为下标;否则为01.l1;rn2.whilelrdo3.m(l+r)/24.ifTm=xthenreturnm/x恰好等于中位元素5.elseifTmmthenrm16.elselm+1return0二分归并排序MergeSort(见第1章),时间复杂度分析,二分检索最坏情况下时间复杂度W(n)满足二分归并排序最坏情况下时间复杂度W(n)满足,可以解出W(n)=nlognn1.,可以解出W(n)=logn1.,4,2.1.2分治算法的一般性描述,分治算法Divide-and-Conquer(P)1.if|P|cthenS(P).2.dividePintoP1,P2,Pk3.fori1tok4.yiDivide-and-Conquer(Pi)5ReturnMerge(y1,y2,yk)算法时间复杂度的递推方程一般原则:子问题均匀划分、递归处理,5,分治策略的算法分析工具:递推方程两类递推方程求解方法第一类方程:迭代法、换元法、递归树、尝试法第二类方程:迭代法、递归树、主定理,2.2分治算法的分析技术,递推方程的解,方程d(n)为常数d(n)=cn,7,条件:有n片芯片,(好芯片至少比坏芯片多1片).问题:使用最少测试次数,从中挑出1片好芯片.对芯片A与B测试,结果分析如下:,例2.1芯片测试,算法思想:两两一组测试,淘汰后芯片进入下一轮.如果测试结果是情况1,那么A、B中留1片,丢1片;如果是后三种情况,则把A和B全部丢掉.,8,分治算法,命题2.1当n是偶数时,在上述规则下,经过一轮淘汰,剩下的好芯片比坏芯片至少多1片.证设A与B都是好芯片有i组,A与B一好一坏有j组,A与B都坏有k组,淘汰后,好芯片数i,坏芯片数至多k2i+2j+2k=n2i+j2k+jik注:当n是奇数时,用其他芯片测试轮空芯片,如果轮空芯片是好的,算法结束;否则淘汰轮空芯片.每轮淘汰后,芯片数至少减半,时间复杂度是:,9,伪码描述,算法2.3Test(n)1kn2whilek3do3将芯片分成k/2组/如有轮空芯片,特殊处理4fori=1tok/2doif2片好,则任取1片留下else2片同时丢掉5k剩下的芯片数6ifk=3then任取2片芯片测试if1好1坏then取没测的芯片else任取1片被测芯片7ifk=2or1then任取1片,10,例2.2幂乘计算,问题:设a是给定实数,计算an,n为自然数传统算法:Q(n),an=,an/2an/2n为偶数,a(n1)/2a(n1)/2an为奇数,分治法,W(n)=W(n/2)+Q(1)W(n)=Q(logn).,11,计算Fibonacci数,增加F0=0,得到数列0,1,1,2,3,5,8,13,21,通常算法:从F0,F1,根据定义陆续相加,时间为(n)定理2.1设Fn为Fibonacci数构成的数列,那么,Fibonacci数1,1,2,3,5,8,13,21,满足Fn=Fn-1+Fn-2,算法:令矩阵,用分治法计算Mn时间T(n)=Q(logn).,12,2.3改进分治算法的途径,2.3.1通过代数变换减少子问题个数例2.3位乘问题设X,Y是n位二进制数,n=2k,求XY.一般分治法令XA2n/2+B,Y=C2n/2+D.XY=AC2n+(AD+BC)2n/2+BDW(n)=4W(n/2)+cn,W(1)=1W(n)=O(n2)代数变换AD+BC=(AB)(DC)+AC+BDW(n)=3W(n/2)+cn,W(1)=1W(n)=O(nlog3)=(n1.59),13,例2.4A,B为两个n阶矩阵,n=2k,计算C=AB.传统算法W(n)=O(n3)分治法将矩阵分块,得其中递推方程W(n)=8W(n/2)+cn2W(1)=1解W(n)=O(n3).,矩阵乘法,14,Strassen矩阵乘法,14,变换方法:M1=A11(B12B22)M2=(A11+A12)B22M3=(A21+A22)B11M4=A22(B21B11)M5=(A11+A22)(B11+B22)M6=(A12A22)(B21+B22)M7=(A11A21)(B11+B12)C11=M5+M4M2+M6C12=M1+M2C21=M3+M4C22=M5+M1M3M7,时间复杂度:,15,算法中的处理尽可能提到递归外面作为预处理例2.5平面点对问题输入:集合S中有n个点,n1,输出:所有的点对之间的最小距离.通常算法:C(n,2)个点对计算距离,比较最少需O(n2)时间分治策略:子集P中的点划分成两个子集PL和PR,2.3.2利用预处理减少递归内部操作,16,平面最邻近点对算法,MinDistance(P,X,Y)输入:n个点的集合P,X和Y分别为横、纵坐标数组输出:最近的两个点及距离1.如果P中点数小于等于3,则直接计算其中的最小距离2.排序X,Y3做垂直线l将P划分为PL和PR,PL的点在l左边,PR的点在l右边4MinDidtance(PL,XL,YL);L=PL中的最小距离5MinDistance(PR,XR,YR);R=PR中的最小距离6=min(L,R)7对于在l线左边距离内每个点,检查右边是否有与之距离小于的点,如果存在则将修改为新值,17,右边每个小方格至多1个点,每个点至多比较对面的6个点,距离的2个点(左右各1个)其纵坐标位置相差不超过12,检查1个点是常数时间,O(n)个点需要O(n)时间,跨边界的最邻近点,l,18,由递归树估计T(n)=O(nlog2n),算法分析,分析:步1O(1)步2O(nlogn)步3O(1)步4-52T(n/2)步6O(1)步7O(n),19,预排序的处理方法,解得T(n)=O(nlogn)W(n)=O(nlogn),在每次调用时将已经排好的数组分成两个排序的子集,每次调用这个过程的时间为O(n)W(n)总时间,T(n)算法递归过程,O(nlogn)预处理排序,20,实例:递归中的拆分,l,21,典型实例分析,2.4.1快速排序算法Quicksort(A,p,r)输入:数组Ap.r输出:排好序的数组A1.ifpx9.ifij10.thenAiAj11.ifi=j1thenreturnj12.elsereturnj,划分过程,23,划分实例,27990813648616710882590ij27250813648616710889990ij27250813108616764889990ij27250813107168664889990ji16250813107278664889990,24,最坏情况,最好划分,均衡划分,最坏情况下的时间复杂度,25,均衡划分,O(n),O(n),O(n),O(n),O(nlogn),26,假设输入数组首元素排好序后的正确位置处在1,2,n各种情况是等可能的,概率为1/n.利用差消法求得T(n)=O(nlogn),平均情况下时间复杂度,27,问题:从给定的集合L中选择第i小的元素不妨设L为n个不等的实数i=1,称为最小元素;i=n,称为最大元素;i=n-1,称为第二大元素;位置处在中间的元素,称为中位元素当n为奇数时,中位数只有1个,i=(n+1)/2;当n为偶数时,中位数有2个,i=n/2,n/2+1.也可以规定其中的一个,2.4.2选择问题,28,算法Findmax输入:n个数的数组L输出:max,k1.maxL1;k12.fori2tondo3.ifmax1thengoto28max最大数9Secondmax的链表中的最大,锦标赛算法,32,命题2.2max在第一阶段的分组比较中总计进行了logn次比较.证设本轮参与比较的有t个元素,经过分组淘汰后进入下一轮的元素数至多是t/2.假设k轮淘汰后只剩下一个元素max,利用t/2/2=t/22的结果并对k归纳,可得到n/2k=1.若n=2d,那么有k=dlogn=logn若2dn2d1,那么k=d+1=logn算法时间复杂度是W(n)=n1+logn1=n+logn2.,时间复杂度分析,33,问题:选第k小.输入:数组S,S的长度n,正整数k,1kn.输出:第k小的数通常算法1排序2找第k小的数时间复杂性:O(nlogn),一般性选择问题,34,算法Select(S,k)输入:数组S,正整数k输出:S中的第k小元素1将S划分成5个一组,共n/5个组2每组找一个中位数,所有个中位数放到集合M3m*Select(M,|M|/2)/将S划分成A,B,C,D四个集合4把A和D的每个元素与m*比较,小的构成S1,大的构成S25S1S1C;S2S2B6ifk=|S1|+1then输出m*7elseifk|S1|8thenSelect(S1,k)9.elseSelect(S2,k|S1|1),分治选择算法,35,最坏情况:子问题大小为2r+2r+3r+2=7r+2,36,复杂度估计W(n)=O(n),不妨设n=5(2r+1),|A|=|D|=2r,算法工作量行2:O(n)行3:W(n/5)行4:O(n)行8-9:W(7r+2)用递归树做复杂度估计,递归树,j0,1,2n1,1的2n次根,例如n=4,1的8次方根是:,39,多项式求值,给定多项式:设x为1的2n次方根,对所有的x计算A(x)的值.算法1:对每个x做下述运算:依次计算每个项aixi,对i求和得到A(x),T1(n)=O(n3)算法2:A1(x)=an1A2(x)=an2+xA1(x)A3(x)=an3+xA2(x)An(x)=a0+xAn1(x)=A(x)对每个x按照上述顺序求值T2(n)=O(n2),40,分治算法,原理:Aeven(x)=a0+a2x+a4x2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论