第4章 分治法.ppt
《第4章 分治法.ppt》由会员分享,可在线阅读,更多相关《第4章 分治法.ppt(97页珍藏版)》请在麦多课文档分享上搜索。
1、第4章 分治法, “分”而治之,主要内容,一般方法 二分检索 找最大和最小元素 归并分类 快速分类 选择问题 斯特拉森矩阵乘法,对大规模问题的求解 利用分治法求解大规模问题,1.基本思想分而治之方法与软件设计的模块化方法非常相似。为解决一个大问题,可以(1)把它分解成两个或多个更小的问题;(2)分别解决每个小问题;(3)把各小问题的解答组合起来,即可得到原问题的解。小问题通常与原问题相似或同质 ,因而可以递归地使用分而治之策略解决。,3.1 一般方法,通常,子问题与原始问题“同质”,例1 找伪币 假设16 枚金币中有一枚是伪造的,真假金币的区别仅是重量不同,利用一个没有砝码的天平作工具,找出这
2、枚伪造的金币。,例2 金块问题有一个老板有一袋金块。每个月将有两名雇员会因其优异的表现分别被奖励一个金块。按规矩,排第一的雇员将得到袋中最重的金块,排名第二的雇员将得到袋中最轻的金块。根据这种方式,除非有新金块快加入袋中,否则第一名雇员所得到的金块总是比第二名雇员所得到的金块重,如果有新的金块周期性的加入袋中,则每个月都必须找出最重和最轻的金块。假设有一台比较重量的仪器,希望用最少的比较次数找出最重和最轻的金块。问题的分解策略有多种。,例3 矩阵乘法两个nn阶的矩阵A与B的乘积是另一个nn阶矩阵C,C的元素可表示为:,其时间复杂度为O(n3)。可以采用矩阵分块乘法降低时间复杂度。先将A、B分别
3、分割为4个n/2n/2的矩阵,然后组合。,分治法自然导致了递归算法的使用。在许多例子里,这些递归算法在递归程序中得到了很好的运用。,算法3.1 分治策略的抽象化控制 procedure DANDC(p,q) global n,A(1:n);integer m,p,q; /1pqn/if SMALL(p,q)then return(G(p,q)else mDIVIDE(p,q) /pmq/ return(COMBINE(DANDC(p,m), DANDC(m+1,q)endif end DANDC,注: k=2: 二分是最常用的分解策略; SMALL(p,q):布尔函数,判断输入规模q-p+1是
4、否足够小而无需再进一步分就可求解; G(p,q):对输入规模为q-p+1的子问题求解(SMALL(p,q)为真时); DIVIDE(p.q):对输入规模为q-p+1的子问题进一步分解,返回值为p,q区间进一步的分割点(SMALL(p,q)为假时; COMBINE(x,y):子结果的合并函数,将区间p,m和m+1,q上的子问题的解合并成上级区间p,q上的“较完整”的解。当p=1,q=n时,就得到整个问题的解。,2. 分治策略的抽象化控制,DANDC的计算时间若所分成的两个子问题的输入规模大致相等,则DANDC总的计算时间可用递归关系式表示,如下:g(n) n足够小T(n) = 2T(n/2) +
5、 f(n) 否则,注:T(n):表示输入规模为n的DANDC计算时间g(n):表示对足够小的输入规模直接求解的计算时间f(n):表示COMBINE对两个子区间的子结果进行合并的时间(该公式针对具体问题有各种不同的变形),分治法的另一种模型表示,proc dividandconquer(n)if n=n0 then g(n)else divid n into small suninstancesn1 n2 n3nkfor i=1 to k doyi=dividandconquer(ni)return merge(y1yk) end dividandconquer,T(n)= G(n) nn0 其
6、中,f(n)是合并各部分解的时间,k,m均为常数,进一步思考,n0选择多大合适? 原问题应该分解成几个子问题? 大量实践得出子问题的规模大致相当分治的效率较好。 一般进行2分法。,3.2 二分检索(折半查找),1. 问题的描述已知一个按非降次序排列的元素表a1, a2, ,an,判定某给定的元素x是否在该表中出现。若是,则找出x在表中的位置并返回其所在下标若非,则返回0值。,分治求解策略分析:定义问题的形式描述:I=(n, a1, a2, ,an,x)问题分解:选取下标k,由此将I分解为3个子问题: I1=(k-1, a1, a2, ,ak-1,x)I2=(1, ak,x)I3=(n-k, a
7、k+1, ak+2, ,an,x)对于I2,若ak=x,则有解k,对I1、I3不用再求解;否则,若xak,则只在I3中求解,对I1不用求解;I1 、I3上的求解可再次采用分治方法划分后求解(递归过程)k的不同选择策略导致不同的检索算法:二分检索,Fibonacci检索,线性插值检索,随机检索。,2. 二分检索算法,算法3.3 二分检索 procedure BINSRCH(A,n,x,j)integer low,high,mid,j,n;low1; highn;while lowhigh domid case:xA(mid):low mid+1 :else:jmid;returnendcaser
8、epeatj 0 end NIBSRCH,注:给定一个按非降次序排列的元素数组A(1:n),n1,判断x是否出现。 若是,置j,使得x=A(j) 若非,j=0,例3.1:设A(1:9)=(-15,-6,0,7,9,23,54,82,101)在A中检索x=101,-14,82。执行轨迹见下表1,成功的检索,不成功的检索,成功的检索,3. 算法的正确性证明 定理3.1 过程BINSRCH(A,n,x,j)能正确运行 证明: 1)在具体指定A中的数据元素及x的数据类型后,算法中的所有运算都能按要求正确运行即首先满足确定性和能行性 2)终止性算法初始部分置low1, highn 若n=0,不进入循环,
9、j置0,算法终止 否则,进入循环,计算mid,或 x=A(mid),j置为mid,算法终止;或xA(mid),置lowmid+1,进入下次循环;搜索范围实际缩小为mid+1, high,对low, mid-1区间不做进一步搜索;因low, high, mid都是整型变量,故按照上述规则,在有限步内,或找到某个mid,有A(mid) = x;或变得lowhigh,在A中没有找到任何元素等于x,算法终止。,4. 性能分析,1)空间特性n+5个空间位置(n) 2) 时间特性区分以下情况,并进行相应的分析 成功检索:所检索的x出现在A中。 成功检索情况共有n种:x恰好是A中的某个元素,A中共有n个元素
10、,故有n种可能的情况 不成功检索:所检索的x不出现在A中。不成功检索情况共有n+1种:xA(n) 成功/不成功检索的最好情况:执行步数最少,计算时间最短 成功/不成功检索的最坏情况:执行步数最多,计算时间最长 成功/不成功检索的平均情况:一般情况下的计算时间,实例分析(例3.1),频率计数特征while循环体外语句的频率计数为1集中考虑while循环中的x与A中元素的比较(其它运算的频率计数与之有相同的数量级)假定只需一次比较就可确定case语句是三种情况的哪一种。查找每个元素所需的元素比较次数如下:,A 元素 -15 -6 0 7 9 23 54 82 101 成功检索 3 2 3 4 1
11、3 2 3 4 比较次数 不成功检索3 3 3 4 4 3 3 3 4 4 比较次数,9个元素情况下: 成功检索最好:1次最坏:4次平均:(3+2+3+4+1+3+2+3+4)/92.77次 不成功检索最好:3次最坏:4次平均:(3+3+3+4+4+3+3+3+4+4)/10 = 3.4次,二元比较树,算法执行过程的主体是x与一系列中间元素A(mid)比较。可用一棵二元树描述这一过程,称之为二元比较树。 构造:比较树由内结点和外结点的两种结点组成: 内结点:表示一次元素比较,用圆形结点表示,存放一个mid值;代表一次成功检索; 外结点:表示一种不成功检索的情况,用方形结点表示。 路径:表示一个
12、元素的比较序列。,例3.1的二元比较树,基于二元比较树的分析若x在A中出现,则算法的执行过程在一个圆形的内结点处结束。若x不在A中出现,则算法的执行过程在一个方形的外结点处结束外结点不代表元素的比较,因为比较过程在该外结点的上一级的内结点处结束。,例3.1的二元比较树,6,定理3.2 若n在区域2k-1,2k)中,则对于一次成功的检索,BINSRCH至多做k次比较;对于一次不成功的检索,或者做k-1次比较,或者做k次比较。 证明:成功检索都在内结点处结束,不成功检索都在外结点处结束当2k-1n2k时,所有内结点在1至k级,所有外结点在第k级 或第k+1级,故:成功检索在i级终止所需要的元素比较
13、次数是i不成功检索在i级外部结点终止的元素比较次数是i-1,BINSRCH计算复杂度的理论分析,1)不成功检索的最好、最坏和平均情况的计算时间均为 外结点处在最末的两级上;2)最好情况下的成功检索的计算时间为最坏情况下的成功检索的计算时间为,3)平均情况下的成功检索的计算时间分析利用外部结点和内部结点到根距离和之间的关系进行推导:记,由根到所有内结点的距离之和称为内部路径长度,记为I;由根到所有外部结点的距离之和称为外部路径长度,记为E。则有,E=I+2n 引入记号U(n) ,S(n)。U(n)是平均情况下不成功检索的计算时间,(外结点的比较次数是根到该结点的路径长度),则U(n) = E/(
14、n+1) S(n)是平均情况下成功检索的计算时间,(内结点表示元素比较次数是由跟到该结点的路径长度+1)则S(n) = (I+n)/n=I/n+1,利用上述公式,可有: S(n) = (1+1/n)U(n) -1当n,S(n) U(n) ,而U(n) =所以 S(n) =,1,2,3,5. 以比较为基础检索的时间下界,问题:设n个元素的数组A(1:n)有A(1) A(2) A(n)。检索一给定元素x是否在A中出现。定理3.2给出了二分检索算法的时间下界。能否预计还存在有以元素比较为基础的另外的检索算法,它在最坏情况下比二分检索算法在计算时间上有更低的数量级?以比较为基础的算法:假定算法中只允许
15、进行元素间的比较,而不允许对它们实施其它运算。,注:每个内结点表示一次元素的比较。每棵比较树中恰好含有n个内结点,分别与n个不同i值相对应;每个外结点对应一次不成功的检索,并恰好有n+1个外结点对应于n+1中不成功检索的情况。,任何以比较为基础的检索算法,其执行过程都可以用二元比较树来描述。,以比较为基础的有序检索问题最坏情况的时间下界 定理3.3 设A(1:n)含有 n(n1)个不同的元素,排序为A(1) A(2) A(n)。又设用以比较为基础的算法去判断是否 ,则这样的任何算法在最坏情况下所需的最小比较次数FIND(n)有:,证明:从模拟求解检索问题算法的比较树可知,FIND(n)不大于树
16、中由根到一个叶子的最长路经的距离。而所有树中必定有n个内结点与x在A中的n中可能的出现相对应。如果一棵二元树的所有内结点所在的级数小于或等于k,则最多有2k-1个内结点。故n2k-1,即,任何一种以比较为基础的算法,在最坏情况下的计算时间都不低于(logn)。因此, 不可能存在最坏情况比二分检索数量级还低的算法。 二分检索是解决检索问题的最优的最坏情况算法。,3.3 找最大和最小元素,问题描述:给定含有n个元素的集合,在其中找出最大和最小元素。,1. 直接找最大和最小元素 算法3.5 直接找最大和最小元素 procedure STRAITMAXMIN(A,n,max,min) /将A中的最大值
17、置于max,最小值置于min/Integer i,nmaxminA(1)for i2 to n doif A(i) max thenmaxA(i)endifif A(i) min then minA(i)endifrepeat end STRAITMAXMIN,算法的性能: 只考虑算法中的比较运算,以此代表算法的执行特征; 该算法最好、最坏、平均情况下均需要做2(n-1)次元素比较,STRAITMAXMIN算法的一种简单改进形式: procedure STRAITMAXMIN1(A,n,max,min)integer i,nmaxminA(1)for i2 to n doif A(i) max
18、 then maxA(i) endifelse if A(i) min then minA(i) endifrepeat end STRAITMAXMIN1 这使得, 最好情况:按递增次序排列,元素比较次数为n-1次 最坏情况:按递减次序排列,元素比较次数为2(n-1)次 平均情况:元素比较次数为3(n-1)/2次,2. 分治求解策略记问题的一个实例为:I = (n, A(1), , A(n)采用二分法将I分成两个子集合处理I1 = ( , A(1), ,A( ),和I2 = (n- , A( +1), , A(n)则有,MAX(I) = max(MAX(I1),MAX(I2)MIN(I) =
19、 min(MIN(I1),MIN(I2)采用递归的设计策略,得到以下算法:,3. 一种递归求解策略,算法3.6 递归求取最大和最小元素 procedure MAXMIN(i,j,fmax,fmin)/A(1:n)是含有n个元素的数组,参数i,j是整数,1i,jn /该过程把A(i:n)中的最大和最小元素分别赋给max和min /integer i,j;global n,A(1:n)case:i=j: fmaxfminA(i) /只有一个元素:i=j-1:if A(i)A(j) then fmaxA(j);fminA(i)else fmaxA(i);fminA(j) /两个元素的情况endif:
20、else: mid /取中call MAXMIN(i,mid,gmax,gmin)call MAXMIN(mid +1,j,hmax,hmin)fmaxmax(gmax,hmax); fminmin(gmin,hmin)end caseend MAXMIN,例:在A(1:9) = (22,13,-5,-8,15,60,17,31,47)上执行算法3.6,每个结点内的值分别是: i, j, fmax, fmin,递归调用,递归调用分解过程,递归调用的返回,性能分析,当n是2的幂时(n=2k),化简上式有:,若2k-1n2k,+2,性能分析 1)与STRAITMAXMIN算法相比,比较次数减少了2
21、5%(3n/2-2 : 2n-2)。已经达到了以元素比较为基础的找最大最小元素的算法计算时间的下界: 2)存在的问题: 空间占用量大 有 级的递归,入栈参数: i, j, fmax, fmin和返回地址五个值。时间可能不比预计的理想如果元素A(i)和A(j)的比较与i和j的比较相差不大时,算法MAXMIN不可取。,假设元素的比较与i和j的比较时间相同(整型数)。又设case语句中仅需一次i和j的比较就能够确定是哪种情况。记此时MAXMIN的频率计数为C(n),n=2k (k为正整数)。则有,2 n=2C(n) = 2C(n/2)+3 n2化简得,C(n) = 2C(n/2) + 3 = = 5
22、n/2 -3按照同样的假设,重新估算STRAITMAXMIN算法的比较次数为:3(n-1)。考虑MAXMIN算法递归调用的开销,此时MAXMIN算法的效率可能还不如STRAITMAXMI算法。,结论:如果A中的元素间的比较代价远比整型数(下标)的比较昂贵,则分治方法将产生一个效率较高的算法;反之,可能仅得到一个低效的算法。故,分治策略只能看成一个较好的但并不总是成功的算法设计指导。,3.4 归并分类,1. 分类问题排序给定一n个元素的集合A,按照某种方法将A中的元素按非降或非增次序排列。分类:内排序,外排序 内排序:以比较为基础(键排序)、位排序、映射排序常见内排序方法:冒泡排序插入排序归并排
23、序快速排序堆排序,2. 插入分类,算法3.7 插入分类 procedure INSERTIONSORT(A,n)/将A(1:n)中的元素按非降次序分类,n1for j2 to n do /A(1:j-1)已分类itemA(j); /岗哨ij-1while itemA(i) do /0ij A(i+1)A(i); ii-1repeatA(i+1) item;repeatend INSERTIONSORT,基本思想: 将A(j)插入到已排序的序列A(1)A(j-1)中。 从j-1向前找到位置i将其插入,性能分析:最坏情况:输入数据按非增次序排列,每次内层while循环执行j次(j=2,3, n)。
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
2000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分治 PPT
