算法-分治法课件.ppt
《算法-分治法课件.ppt》由会员分享,可在线阅读,更多相关《算法-分治法课件.ppt(56页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2023/1/25分治法第第4章章分治法分治法4.1 概概 述述 4.2 排序问题中的分治法排序问题中的分治法4.3 组合问题中的分治法组合问题中的分治法4.4 几何问题中的分治法几何问题中的分治法 分治法是最著名的算法设计技术。分治法是最著名的算法设计技术。1/562023/1/25分治法4.1 概概 述述 4.1.1分治法的设计思想分治法的设计思想4.1.2数字旋转方阵数字旋转方阵2/562023/1/25分治法 将一个难以直接解决的大问题,划分成一些规模将一个难以直接解决的大问题,划分成一些规模较小的子问题,分别求解各个子问题,再合并子问较小的子问题,分别求解各个子问题,再合并子问题的解
2、得到原问题的解。题的解得到原问题的解。4.1.1分治法的设计思想分治法的设计思想如果子问题的规模仍然不够小,可继续分解下去。如果子问题的规模仍然不够小,可继续分解下去。3/562023/1/25分治法分治法的求解过程:分分治法的求解过程:分-治治-合合 (1 1)划分划分:把规模为:把规模为n n的原问题划分为的原问题划分为k k个规模较个规模较小的子问题,并尽量使这小的子问题,并尽量使这k k个子问题的规模大致相同。个子问题的规模大致相同。(2 2)求解子问题求解子问题:各子问题的解法与原问题的解:各子问题的解法与原问题的解法通常是相同的,可以用递归的方法求解各个子问题。法通常是相同的,可以
3、用递归的方法求解各个子问题。(3 3)合并合并:把各个子问题的解合并起来,分治算法:把各个子问题的解合并起来,分治算法的有效性很大程度上依赖于合并的实现。的有效性很大程度上依赖于合并的实现。4/562023/1/25分治法2.独立子问题独立子问题:各子问题之间相互独立。:各子问题之间相互独立。1.平衡子问题平衡子问题:最好使子问题的规模大:最好使子问题的规模大致相同。致相同。启发式规则:启发式规则:5/562023/1/25分治法子问题子问题1的规模是的规模是n/2子问题子问题1的解的解子问题子问题2的解的解子问题子问题2的规模是的规模是n/2原问题的解原问题的解原问题原问题的规模是的规模是n
4、分治法的典型情况分治法的典型情况6/562023/1/25分治法例:计算例:计算an,应用分治技术得到如下计算方法:,应用分治技术得到如下计算方法:3432328131319313193333分解问题分解问题求解每个子问题求解每个子问题合并子问题的解合并子问题的解v 不是所有的分治法都比简单的蛮力法更有效。不是所有的分治法都比简单的蛮力法更有效。分析时间性能 =1122naanaannn如果如果如果如果7/562023/1/25分治法4.1.2数字旋转方阵数字旋转方阵问题:问题:输输出出N N(1 N 10)数字旋数字旋转转方方阵阵。120 19 18 17 16221 32 31 30 15
5、322 33 36 29 14423 34 35 28 13524 25 26 27 1267 8 9 10 116 6的旋转方阵的旋转方阵8/562023/1/25分治法4.2排序问题中的分治法排序问题中的分治法4.2.1 4.2.1 归并排序归并排序4.2.2 4.2.2 快速排序快速排序92023/1/25分治法4.3.1归并排序归并排序二路归并排序的分治策略是:二路归并排序的分治策略是:(1)划划分分:将将待待排排序序序序列列r1,r2,rn划划分分为为两两个个长度相等的子序列长度相等的子序列r1,rn/2和和rn/21,rn;(2)求求解解子子问问题题:分分别别对对这这两两个个子子序
6、序列列进进行行排排序序,得到两个有序子序列;得到两个有序子序列;(3)合合并并:将将这这两两个个有有序序子子序序列列合合并并成成一一个个有有序序序列。序列。10/562023/1/25分治法 r1 rn/2rn/21rn划分划分r1rn/2rn/21rn递归处理递归处理r1rn/2rn/21r n合并解合并解举举例:例:8326715411/562023/1/25分治法算法算法4.3归并排序归并排序voidMergeSort(intr,ints,intt)intm,r11000;if(s=t)return;elsem=(s+t)/2;Mergesort(r,s,m);/归并排序前半个子序列归并
7、排序前半个子序列Mergesort(r,m+1,t);/归并排序后半个子序列归并排序后半个子序列Merge(r,r1,s,m,t);/合并两个已排序的子序列合并两个已排序的子序列for(inti=s;i+=1)2(211)(nnnTnnT13/562023/1/25分治法算法算法4.4合并有序子序列合并有序子序列voidMerge(intr,intr1,ints,intm,intt)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)/若第一个子序
8、列没处理完,则进行收尾处理若第一个子序列没处理完,则进行收尾处理r1k+=ri+;elsewhile(j=t)/若第二个子序列没处理完,则进行收尾处理若第二个子序列没处理完,则进行收尾处理r1k+=rj+;14/562023/1/25分治法4.3.2快速排序快速排序(2)求解子问题求解子问题:分别对划分后的每一个子序列递:分别对划分后的每一个子序列递归处理;归处理;(3)合并合并:由于对子序列:由于对子序列r1ri-1和和ri+1rn的排序的排序是就地进行的,所以合并不需要执行任何操作。是就地进行的,所以合并不需要执行任何操作。快速排序的分治策略是:快速排序的分治策略是:(1)划划分分:选选定
9、定一一个个记记录录作作为为轴轴值值,以以轴轴值值为为基基准准将整个序列划分为两个子序列;将整个序列划分为两个子序列;15/562023/1/25分治法r1ri-1 ri ri+1rn 均均ri 轴值轴值均均ri 位于最终位置位于最终位置v归并排序按照记录在序列中的位置对序列进行划分,归并排序按照记录在序列中的位置对序列进行划分,v快速排序按照记录的值对序列进行划分。快速排序按照记录的值对序列进行划分。16/562023/1/25分治法以第一个记录作为轴值,对待排序序列进行划分的过程为:以第一个记录作为轴值,对待排序序列进行划分的过程为:(1)初始化初始化:取第一个记录作为基准,设置两个参数:取
10、第一个记录作为基准,设置两个参数i,j;(2 2)右侧扫描过程右侧扫描过程:(3 3)左侧扫描过程左侧扫描过程:(4 4)重复重复(2 2)()(3 3)步,直到)步,直到i i与与j j指向同一位置,即基准记指向同一位置,即基准记录最终的位置。录最终的位置。172023/1/25分治法1313656527275050383849495555jijj1313656527275050383849495555jiii1313656527275050383849495555ijjj一次划分示例一次划分示例一次划分示例一次划分示例182023/1/25分治法算法算法4.5一次划分一次划分intPart
11、ition(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为轴值记录的最终位置为轴值记录的最终位置192023/1/25分治法以以轴轴值值为为基基准准将将待待排排序序序序列列划划分分为为两两个个子子序序列后,对每一个子序列分别递归进行排序。列后,对每一个子序列分别递归进行排序
12、。131327275050383849495555jiij13136565272750503838494955556565202023/1/25分治法算法算法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);/对应情况对应情况,递归求解,递归求解302023/1/25分
13、治法s1=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 k0时,可将时,可将2k2k2k2k的棋盘划分为的棋盘划分为4 4个个2k-12k-12k-12k-1的
14、子的子棋盘,这样划分后,由于原棋盘只有一个特殊方格,所以,棋盘,这样划分后,由于原棋盘只有一个特殊方格,所以,这这4 4个子棋盘中只有一个子棋盘包含该特殊方格,其余个子棋盘中只有一个子棋盘包含该特殊方格,其余3 3个个子棋盘中没有特殊方格。子棋盘中没有特殊方格。为了将这为了将这3 3个没有特殊方格的子棋盘转化为特殊棋盘,以个没有特殊方格的子棋盘转化为特殊棋盘,以便采用递归方法求解,可以用一个便采用递归方法求解,可以用一个L L型骨牌覆盖这型骨牌覆盖这3 3个较小棋个较小棋盘的会合处,从而将原问题转化为盘的会合处,从而将原问题转化为4 4个较小规模的棋盘覆盖问个较小规模的棋盘覆盖问题。递归地使用
15、这种划分策略,直至将棋盘分割为题。递归地使用这种划分策略,直至将棋盘分割为1 11 1的子的子棋盘。棋盘。342023/1/25分治法2k-12k-12k-12k-12k-12k-12k-12k-1(a)棋盘分割棋盘分割(b)构造相同子问题构造相同子问题35/562023/1/25分治法 设设T(k)是覆盖一个是覆盖一个2k2k棋盘所需时间,从算棋盘所需时间,从算法的划分策略可知,法的划分策略可知,T(k)满足如下递推式:满足如下递推式:解此递推式可得解此递推式可得T(k)=O(4k)。由于覆盖一个。由于覆盖一个2k2k棋盘所需的骨牌个数为棋盘所需的骨牌个数为(4k-1)/3,所以,算,所以,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 分治 课件
限制150内