算法设计与分析-王红梅-第二版-第4章-分治法.ppt
- 文档编号:30853286
- 上传时间:2024-03-02
- 格式:PPT
- 页数:85
- 大小:2.67MB
算法设计与分析-王红梅-第二版-第4章-分治法.ppt
《算法设计与分析-王红梅-第二版-第4章-分治法.ppt》由会员分享,可在线阅读,更多相关《算法设计与分析-王红梅-第二版-第4章-分治法.ppt(85页珍藏版)》请在冰豆网上搜索。
第4章分治法算法设计与分析算法设计与分析算法设计与分析算法设计与分析本科本科本科本科生课程生课程生课程生课程DesignandAnalysisofAlgorithmDesignandAnalysisofAlgorithm海南大学信息科学技术学院海南大学信息科学技术学院CollegeofInformationScienceandCollegeofInformationScienceandTechnology,HainanUniversityTechnology,HainanUniversity2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod22本章要点本章要点4.1概概述述4.2排序问题中的分治法排序问题中的分治法4.3组合问题中的分治法组合问题中的分治法4.4几何问题中的分治法几何问题中的分治法阅读材料阅读材料递归函数的执行过程递归函数的执行过程2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod33教学重点教学重点分治法的设计思想,各种经典问题的分治思想分治法的设计思想,各种经典问题的分治思想教学难点教学难点几何问题的分治算法几何问题的分治算法教学内容教学内容及目标及目标知识点知识点教学要求教学要求了解了解理解理解掌握掌握熟练掌熟练掌握握分治法设计思想分治法设计思想归并排序和快速排序归并排序和快速排序最大子段和问题最大子段和问题棋盘覆盖问题棋盘覆盖问题最近对问题最近对问题凸包问题凸包问题学习目标学习目标2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod444.1.1分治法的设计思想分治法的设计思想4.1.2分治法的求解过程分治法的求解过程概概述述2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod55将一个难以直接解决的大问题,划分成将一个难以直接解决的大问题,划分成一些规模较小的一些规模较小的子问题子问题,以各个击破,以各个击破,分而治之分而治之。
更一般地说,将要求解的。
更一般地说,将要求解的原问题原问题划分成划分成k个较小规模的子问题个较小规模的子问题,对这,对这k个子问题分别求个子问题分别求解。
如果子问题的规模仍然不够小,则再将每个子问题划分解。
如果子问题的规模仍然不够小,则再将每个子问题划分为为k个规模更小的子问题,如此分解下去,个规模更小的子问题,如此分解下去,直到问题规模足够直到问题规模足够小,很容易求出其解为止小,很容易求出其解为止,再将子问题的解合并为一个更大,再将子问题的解合并为一个更大规模的问题的解,自底向上逐步求出原问题的解。
规模的问题的解,自底向上逐步求出原问题的解。
分治法的设计思想:
分治法的设计思想:
概述概述-分治法思想分治法思想2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod662.独立子问题:
独立子问题:
各子问题之间相互独立,这涉及到分治法的各子问题之间相互独立,这涉及到分治法的效率,如果各子问题效率,如果各子问题不是独立的不是独立的,则,则分治法需要重复地解公分治法需要重复地解公共的子问题共的子问题。
1.平衡子问题:
平衡子问题:
最好使子问题的规模大致相同。
也就是将一最好使子问题的规模大致相同。
也就是将一个问题个问题划分成大小相等的划分成大小相等的k个子问题个子问题(通常(通常k2、4,),这),这种使子问题规模大致相等的做法是种使子问题规模大致相等的做法是出自一种平衡出自一种平衡(Balancing)子问题的思想)子问题的思想,它几乎,它几乎总是比总是比子问题规模不等子问题规模不等的做法要好。
的做法要好。
启发式规则:
启发式规则:
概述概述-分治法思想分治法思想2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod77子问题子问题1的规模是的规模是n/2子问题子问题1的解的解子问题子问题2的解的解子问题子问题2的规模是的规模是n/2原问题的解原问题的解原问题原问题的规模是的规模是n分治法的典型情况分治法的典型情况概述概述-分治法思想分治法思想2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod88一般来说,分治法的求解过程由以下三个阶段组成:
一般来说,分治法的求解过程由以下三个阶段组成:
(11)划划分分:
既既然然是是分分治治,当当然然要要把把规规模模为为nn的的原原问问题题划划分分为为kk个个规规模模较较小小的的子子问问题题,并并尽尽量量使使这这kk个个子子问问题题的的规规模大致相同。
模大致相同。
(22)求求解解子子问问题题:
各各子子问问题题的的解解法法与与原原问问题题的的解解法法通通常常是是相相同同的的,可可以以用用递递归归的的方方法法求求解解各各个个子子问问题题,有有时时递递归归处理也可以用循环来实现。
处理也可以用循环来实现。
(33)合并:
合并:
把各个子问题的解合并起来,合并的代价因把各个子问题的解合并起来,合并的代价因情况不同有很大差异,分治算法的情况不同有很大差异,分治算法的有效性很大程度上依赖有效性很大程度上依赖于合并的实现于合并的实现。
概述概述-分治法的求解过程分治法的求解过程2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod99概述概述-分治法的求解过程分治法的求解过程分治法的一般过程分治法的一般过程1DivideConquer(P)(P)/求解规模为求解规模为n的问题的问题P23if(P(P的规模足够小的规模足够小)直接求解直接求解P;分解为分解为k个子问题个子问题P1,P2,Pk;4for(i=1;i*=1122naanaannn如果如果如果如果2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod11114.1.1分治法的设计思想分治法的设计思想4.1.2一个简单的例子一个简单的例子数字旋转方阵数字旋转方阵概概述述2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod1212问题问题输出如图输出如图4.3(a)所示所示N*N(1N10)的数字旋转方阵)的数字旋转方阵思路思路用二维数组表示方阵,从外层向里层填数,如图用二维数组表示方阵,从外层向里层填数,如图(b)所示,所示,将每一层的填数过程分为将每一层的填数过程分为ABCD四个区域。
每填一层四个区域。
每填一层size减减2,终止条件是终止条件是size1。
数字旋转方阵数字旋转方阵2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod1313算法算法4.1:
数字旋转方阵:
数字旋转方阵Full输入:
当前层左上角要填的数字输入:
当前层左上角要填的数字number,左上角的坐标,左上角的坐标begin,方阵的阶数,方阵的阶数size输出:
数字旋转方阵输出:
数字旋转方阵1.如果如果size=0,则算法结束;,则算法结束;2.如果如果size=1,则,则databeginbegin=number,算法结束;,算法结束;3.初始化行、列下标初始化行、列下标i=begin,j=begin;4.重复下述操作重复下述操作size-1次,填写区域次,填写区域A1.Dataij=number;number+;i+;数字旋转方阵数字旋转方阵2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod14145.重复下述操作重复下述操作size-1次,填写区域次,填写区域B1.Dataij=number;number+;j+;6.重复下述操作重复下述操作size-1次,填写区域次,填写区域C1.Dataij=number;number+;i-;7.重复下述操作重复下述操作size-1次,填写区域次,填写区域D1.Dataij=number;number+;j-;8.递归调用函数递归调用函数Full在在size-2阶方阵中左上角阶方阵中左上角begin+1处从数字处从数字number开始填数开始填数数字旋转方阵数字旋转方阵2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod1515算法分析算法分析填写填写n阶方阵,四个区域由阶方阵,四个区域由4个循环实现,每个循环个循环实现,每个循环均执行均执行n-1,然后执行递归调用,填写,然后执行递归调用,填写n-2阶方阵。
递推式:
阶方阵。
递推式:
数字旋转方阵数字旋转方阵=T(n-2)+4(n-1)当当n=0时时0nT1)(当当n=1时时当当n1时时设设n为偶数,用扩展递归技术解此递推式,得为偶数,用扩展递归技术解此递推式,得T(n)=T(n-2)+4(n-1)=T(n-4)+4(n-3)+4(n-1)=T(0)+4(n-5)+4(n-3)+4(n-1)=O(n2)2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod1616本章要点本章要点4.1概概述述4.2排序问题中的分治法排序问题中的分治法4.3组合问题中的分治法组合问题中的分治法4.4几何问题中的分治法几何问题中的分治法阅读材料阅读材料递归函数的执行过程递归函数的执行过程2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod1717排序问题中的分治法排序问题中的分治法4.2.14.2.1归并排序归并排序4.2.24.2.2快速排序快速排序2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod1818n归并排序归并排序二路归并排序的分治策略是:
二路归并排序的分治策略是:
(1)划划分分:
将将待待排排序序序序列列r1,r2,rn划划分分为为两两个个长长度相等的子序列度相等的子序列r1,rn/2和和rn/21,rn;
(2)求求解解子子问问题题:
分分别别对对这这两两个个子子序序列列进进行行排排序序,得到两个有序子序列;得到两个有序子序列;(3)合合并并:
将将这这两两个个有有序序子子序序列列合合并并成成一一个个有有序序序序列。
列。
4.2.14.2.1归并排序归并排序2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod1919r1rn/2rn/21rn划分划分r1rn/2rn/21rn递归处理递归处理r1rn/2rn/21rn合并解合并解4.2.14.2.1归并排序归并排序2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod2020想想法法首首先先将将序序列列划划分分为为两两个个子子序序列列,如如子子序序列列长长度度为为1,则则划划分分结结束束,否否则则继继续续执执行行划划分分,结结果果将将具具有有n个个待待排排序序的的记记录录序序列列划划分分为为n个个长长度度为为1的的有有序序子子序序列列;然然后后两两两两合合并并,得得到到n/2个个长长度度为为2的的有有序序子子序序列列,再再进进行行两两两两合合并并直直到到得得到一个长度为到一个长度为n的有序序列。
的有序序列。
4.2.14.2.1归并排序归并排序2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod2121算法算法4.3归并排序归并排序voidMergeSort(intr,intr1,ints,intt)/r原序列数组,原序列数组,r1归并后序列数组归并后序列数组if(s=t)r1s=rs;elsem=(s+t)/2;Mergesort(r,r1,s,m);/归并排序前半个子序列归并排序前半个子序列Mergesort(r,r1,m+1,t);/归并排序后半个子序列归并排序后半个子序列Merge(r1,r,s,m,t);/合并两个已排序的子序列合并两个已排序的子序列4.2.14.2.1归并排序归并排序rs,rmrm+1,rt2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod2222算法算法4.4合并有序子序列合并有序子序列voidMerge(intr,intr1,ints,intm,intt)/i,j分别指向两个待合并的有序子序列,分别指向两个待合并的有序子序列,k指向最终有序序列的当前记录指向最终有序序列的当前记录i=s;j=m+1;k=s;while(i=m&j=t)if(ri=rj)r1k+=ri+;/取取ri和和rj中较小者放入中较小者放入r1kelser1k+=rj+;if(i=m)while(i=m)/若第一个子序列没处理完,则进行收尾处理若第一个子序列没处理完,则进行收尾处理r1k+=ri+;elsewhile(j+=2)2(221)(nnnTnnT4.2.14.2.1归并排序归并排序2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod2424
(2)求解子问题:
求解子问题:
分别对分别对划分后的每一个子序列递归划分后的每一个子序列递归处理;处理;(3)合并:
合并:
由于对子序列由于对子序列r1ri-1和和ri+1rn的排序是的排序是就地进行的,所以合并不需就地进行的,所以合并不需要执行任何操作。
要执行任何操作。
n快速排序的分治策略快速排序的分治策略
(1)划划分分:
选选定定一一个个记记录录作作为为轴轴值值,以以轴轴值值为为基基准准将将整整个个序序列列划划分分为为两两个个子子序序列列r1ri-1和和ri+1rn,前前一一个个子子序序列列中中记记录录的的值值均均小小于于或或等等于于轴轴值值,后后一一个个子子序序列列中中记记录录的的值值均均大大于于或或等等于于轴值轴值;4.2.24.2.2快速排序快速排序r1ri-1riri+1rn均均ri轴值轴值均均ri位于最终位置位于最终位置2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod2525以第一个记录为轴值(可随机),对待排序序列进行划分的以第一个记录为轴值(可随机),对待排序序列进行划分的过程过程:
(1)初初始始化化:
取取第第一一个个记记录录作作为为基基准准,设设置置两两个个参参数数i,j分分别别用用来来指指示示将将要要与与基基准准记记录录进进行行比比较较的的左左侧侧记记录录位位置置和和右右侧侧记记录录位位置置,也就是也就是本次划分的区间本次划分的区间;
(2)右右侧侧扫扫描描过过程程:
将将基基准准记记录录与与j指指向向的的记记录录进进行行比比较较,如如果果j指指向向记记录录的的关关键键码码大大,则则j-,即即前前移移一一个个记记录录位位置置。
重重复复右右侧侧扫扫描描过过程程,直直到到右右侧侧的的记记录录小小(即即反反序序),若若ij,则则将将基基准准记记录录与与j指向的记录进行交换指向的记录进行交换;(3)左左侧侧扫扫描描过过程程:
将将基基准准记记录录与与i指指向向的的记记录录进进行行比比较较,如如果果i指指向向记记录录的的关关键键码码小小,则则i+,即即后后移移一一个个记记录录位位置置。
重重复复左左侧侧扫扫描描过过程程,直直到到左左侧侧的的记记录录大大(即即反反序序),若若ij,则则将将基基准准记记录与录与i指向的记录交换指向的记录交换;4.2.24.2.2快速排序快速排序2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod2626(4)重重复复
(2)(3)步步,直直到到i与与j指指向向同同一一位位置置,即即基基准准记记录最终的位置。
录最终的位置。
4.2.24.2.2快速排序快速排序一次划分示例一次划分示例一次划分示例一次划分示例:
(11)i=1,j=7i=1,j=7,r1r1为基准记录为基准记录为基准记录为基准记录;(22)rirj?
j-:
rirj?
i+:
rirj?
i+:
rirj/rirj/左侧扫描左侧扫描左侧扫描左侧扫描(44)i=j?
ifi=j,theni=j?
ifi=j,then第一次划分基准记录位置找到第一次划分基准记录位置找到第一次划分基准记录位置找到第一次划分基准记录位置找到2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod27271313656527275050383849495555jijj1313656527275050383849495555jiii1313656527275050383849495555ijjj一一一一次次次次划划划划分分分分示示示示例例例例2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod2828算法算法4.5一次划分一次划分intPartition(intr,intfirst,intend)i=first;j=end;/初始化初始化while(ij)while(ij&ri=rj)j-;/右侧扫描右侧扫描if(ij)rirj;/将较小记录交换到前面将较小记录交换到前面i+;while(ij&ri=rj)i+;/左侧扫描左侧扫描if(ij)rjri;/将较大记录交换到后面将较大记录交换到后面j-;retutni;/i为轴值记录的最终位置为轴值记录的最终位置4.2.24.2.2快速排序快速排序2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod2929以以轴轴值值(如如此此处处为为轴轴值值:
38)为为基基准准将将待待排排序序序序列列划划分分为为两两个个子子序序列列后后,对对每每一一个个子子序序列列分分别别递递归归进进行行排序。
排序。
131327275050383849495555jiij131365652727505038384949555565654.2.24.2.2快速排序快速排序2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod3030算法算法4.6快速排序快速排序voidQuickSort(intr,intfirst,intend)if(first0)sum=aleft;elsesum=0;elsecenter=(left+right)/2;/划分划分leftsum=MaxSum(a,left,center);/对应情况对应情况,递归求解,递归求解rightsum=MaxSum(a,center+1,right);/对应情况对应情况,递归求解,递归求解最大子段和问题最大子段和问题2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod4141s1=0;lefts=0;/以下对应情况以下对应情况,先求解,先求解s1for(i=center;i=left;i-)lefts+=ai;if(leftss1)s1=lefts;s2=0;rights=0;/再求解再求解s2for(j=center+1;js2)s2=rights;sum=s1+s2;/计算情况计算情况的最大子段和的最大子段和if(sumleftsum)sum=leftsum;/合并,在合并,在sum、leftsum和和rightsum中取较大者中取较大者if(sum0时,可将时,可将2k2k的棋盘划分为的棋盘划分为4个个2k-12k-1的子棋盘,的子棋盘,这样划分后,由于这样划分后,由于原棋盘只有一个特殊方格原棋盘只有一个特殊方格,所以,这,所以,这4个个子棋盘中只有一个子子棋盘中只有一个子棋盘包含该特殊方格棋盘包含该特殊方格,其余,其余3个子棋盘个子棋盘中没有特殊方格。
为了将这中没有特殊方格。
为了将这3个没有特殊方格的子棋盘转化个没有特殊方格的子棋盘转化为特殊棋盘,以便采用递归方法求解,为特殊棋盘,以便采用递归方法求解,可以用一个可以用一个L型骨牌型骨牌覆盖这覆盖这3个较小棋盘的会合处个较小棋盘的会合处,从而将原问题转化为,从而将原问题转化为4个较个较小规模的棋盘覆盖问题。
递归地使用这种划分策略,直至小规模的棋盘覆盖问题。
递归地使用这种划分策略,直至将棋盘分割为将棋盘分割为11的子棋盘。
的子棋盘。
棋盘覆盖问题棋盘覆盖问题2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod46462k-12k-12k-12k-12k-12k-12k-12k-1(a)棋盘分割棋盘分割(b)构造相同子问题构造相同子问题棋盘覆盖问题棋盘覆盖问题2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod4747下面讨论棋盘覆盖问题中数据结构的设计。
下面讨论棋盘覆盖问题中数据结构的设计。
(1)棋盘:
棋盘:
可以用一个二维数组可以用一个二维数组boardsizesize表示一个棋盘,表示一个棋盘,其中,其中,size=2k。
为了在递归处理的过程中使用同一个棋盘,将。
为了在递归处理的过程中使用同一个棋盘,将数组数组board设为全局变量设为全局变量;
(2)子棋盘:
子棋盘:
整个棋盘用二维数组整个棋盘用二维数组boardsizesize表示,其中表示,其中的子棋盘由棋盘左上角的下标的子棋盘由棋盘左上角的下标tr、tc和和棋盘大小棋盘大小s表示;表示;(3)特殊方格:
特殊方格:
用用boarddrdc表示特殊方格,表示特殊方格,dr和和dc是该特是该特殊方格在二维数组殊方格在二维数组board中的下标中的下标;(4)L型骨牌:
型骨牌:
一个一个2k2k的棋盘中有一个的棋盘中有一个特殊方格特殊方格,所以,所以,用到用到L型骨牌的个数型骨牌的个数为为(4k-1)/3,将所有,将所有L型骨牌从型骨牌从1开始连续开始连续编号,用一个全局变量编号,用一个全局变量t表示。
表示。
棋盘覆盖问题棋盘覆盖问题2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod4848dcdrtrtcsize棋盘覆盖问题中的数据结构棋盘覆盖问题中的数据结构棋盘覆盖问题棋盘覆盖问题2024/3/22024/3/2DivideandConquerMethodDivideandConquerMethod4949算法算法4.8棋盘覆盖棋盘覆盖voidChessBoard(inttr,inttc,intdr,intdc,intsize)/tr和和tc是子棋盘左上角的下标,是子棋盘左上角的下标,dr和和dc是特殊方格的下标
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 分析 红梅 第二 分治