算法-分治法ppt课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《算法-分治法ppt课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 分治 ppt 课件
- 资源描述:
-
1、2022-5-26分治法第第4章章 分治法分治法 4.1 概概 述述 4.2 排序问题中的分治法排序问题中的分治法4.3 组合问题中的分治法组合问题中的分治法4.4 几何问题中的分治法几何问题中的分治法 分治法是最著名的算法设计技术。分治法是最著名的算法设计技术。1/562022-5-26分治法4.1 概概 述述 4.1.1 分治法的设计思想分治法的设计思想 4.1.2 数字旋转方阵数字旋转方阵2/562022-5-26分治法 将一个难以直接解决的大问题,划分成一些规模将一个难以直接解决的大问题,划分成一些规模较小的子问题,分别求解各个子问题,再合并子问较小的子问题,分别求解各个子问题,再合并
2、子问题的解得到原问题的解。题的解得到原问题的解。4.1.1 分治法的设计思想分治法的设计思想 如果子问题的规模仍然不够小,可继续分解下去。如果子问题的规模仍然不够小,可继续分解下去。 3/562022-5-26分治法分治法的求解过程:分分治法的求解过程:分-治治-合合 (1 1)划分划分:把规模为:把规模为n n的原问题划分为的原问题划分为k k个规模较个规模较小的子问题,并尽量使这小的子问题,并尽量使这k k个子问题的规模大致相同。个子问题的规模大致相同。 (2 2)求解子问题求解子问题:各子问题的解法与原问题的解:各子问题的解法与原问题的解法通常是相同的,可以用递归的方法求解各个子问题。法
3、通常是相同的,可以用递归的方法求解各个子问题。 (3 3)合并合并:把各个子问题的解合并起来,分治算:把各个子问题的解合并起来,分治算法的有效性很大程度上依赖于合并的实现。法的有效性很大程度上依赖于合并的实现。4/562022-5-26分治法2. 独立子问题独立子问题:各子问题之间相互独立。:各子问题之间相互独立。1. 平衡子问题平衡子问题:最好使子问题的规模大:最好使子问题的规模大致相同。致相同。启发式规则:启发式规则:5/562022-5-26分治法 子问题子问题1的规模是的规模是n/2 子问题子问题1的解的解 子问题子问题2的解的解 子问题子问题2的规模是的规模是n/2 原问题的解原问题
4、的解 原问题原问题的规模是的规模是n分治法的典型情况分治法的典型情况6/562022-5-26分治法例:计算例:计算an,应用分治技术得到如下计算方法:,应用分治技术得到如下计算方法: 34 32 32 81 31 31 9 31 31 9 3 3 3 3分解问题分解问题求解每个子问题求解每个子问题合并子问题的解合并子问题的解v 不是所有的分治法都比简单的蛮力法更有效。不是所有的分治法都比简单的蛮力法更有效。分析时间性能 = = =1122naanaannn如果如果如果如果7/562022-5-26分治法4.1.2 数字旋转方阵数字旋转方阵问题:问题:输出输出N N(1 N 10)数字旋转方阵
5、。数字旋转方阵。120 19 18 17 16221 32 31 30 15322 33 36 29 14423 34 35 28 13524 25 26 27 1267 8 9 10 116 6的旋转方阵的旋转方阵8/562022-5-26分治法4.2 排序问题中的分治法排序问题中的分治法4.2.1 4.2.1 归并排序归并排序4.2.2 4.2.2 快速排序快速排序92022-5-26分治法4.3.1 归并排序归并排序 二路归并排序的分治策略是:二路归并排序的分治策略是:(1)划分划分:将待排序序列:将待排序序列r1, r2, , rn划分为两个划分为两个长度相等的子序列长度相等的子序列r
6、1, , rn/2和和rn/21, , rn;(2)求解子问题求解子问题:分别对这两个子序列进行排:分别对这两个子序列进行排序,得到两个有序子序列;序,得到两个有序子序列;(3)合并合并:将这两个有序子序列合并成一个有:将这两个有序子序列合并成一个有序序列。序序列。10/562022-5-26分治法 r1 rn/2 rn/21 rn 划分划分r1 rn/2 rn/21 rn 递归处理递归处理r1rn/2rn/21 r n 合并解合并解 举例:举例:8 3 2 6 7 1 5 4 11/562022-5-26分治法 算法算法4.3归并排序归并排序 void MergeSort( (int r ,
7、 int s, int t) ) int m, r11000; if ( (s= =t) ) return; else m=( (s+t) )/2; Mergesort( (r, s, m) ); /归并排序前半个子序列归并排序前半个子序列 Mergesort( (r, m+1, t) ); /归并排序后半个子序列归并排序后半个子序列 Merge( (r, r1, s, m, t) ); /合并两个已排序的子序列合并两个已排序的子序列 for (int i=s; i+=1)2(211)(nnnTnnT13/562022-5-26分治法算法算法4.4合并有序子序列合并有序子序列 void Mer
8、ge( (int r , int r1 , int s, int m, int t) ) i=s; j=m+1; k=s; while ( (i=m & j=t) ) if ( (ri=rj) ) r1k+=ri+; /取取ri和和rj中较小者放入中较小者放入r1k else r1k+=rj+; if ( (i=m) ) while ( (i=m) ) /若第一个子序列没处理完,则进行收尾处理若第一个子序列没处理完,则进行收尾处理 r1k+=ri+; else while ( (j=t) ) /若第二个子序列没处理完,则进行收尾处理若第二个子序列没处理完,则进行收尾处理 r1k+=rj+; 1
9、4/562022-5-26分治法4.3.2 快速排序快速排序 (2)求解子问题求解子问题:分别对划分后的每一个子序列:分别对划分后的每一个子序列递归处理;递归处理;(3)合并合并:由于对子序列:由于对子序列r1 ri-1和和ri+1 rn的排序的排序是就地进行的,所以合并不需要执行任何操作。是就地进行的,所以合并不需要执行任何操作。快速排序的分治策略是:快速排序的分治策略是:(1)划分划分:选定一个记录作为轴值,以轴值为基准:选定一个记录作为轴值,以轴值为基准将整个序列划分为两个子序列;将整个序列划分为两个子序列;15/562022-5-26分治法 r1 ri- -1 ri ri+1 rn 均
10、均ri 轴值轴值 均均ri 位于最终位置位于最终位置 v归并排序按照记录在序列中的位置对序列进行划分,归并排序按照记录在序列中的位置对序列进行划分,v快速排序按照记录的值对序列进行划分。快速排序按照记录的值对序列进行划分。16/562022-5-26分治法以第一个记录作为轴值,对待排序序列进行划分的过程为:以第一个记录作为轴值,对待排序序列进行划分的过程为:(1)初始化初始化:取第一个记录作为基准,设置两个参数:取第一个记录作为基准,设置两个参数i,j;(2 2)右侧扫描过程右侧扫描过程:(3 3)左侧扫描过程左侧扫描过程:(4 4)重复重复(2 2)()(3 3)步,直到)步,直到i i与与
11、j j指向同一位置,即基准记指向同一位置,即基准记录最终的位置。录最终的位置。172022-5-26分治法jijjjiiiijjj一次划分示例一次划分示例182022-5-26分治法算法算法4.5一次划分一次划分 int Partition( (int r , int first, int end) ) i=first; j=end; /初始化初始化 while ( (ij) ) while ( (ij & ri= rj) ) j-; /右侧扫描右侧扫描 if ( (ij) ) rirj; /将较小记录交换到前面将较小记录交换到前面 i+; while ( (ij & ri= rj) ) i+
12、; /左侧扫描左侧扫描 if ( (ij) ) rjri; /将较大记录交换到后面将较大记录交换到后面 j-; retutn i; / i为轴值记录的最终位置为轴值记录的最终位置 192022-5-26分治法 以轴值为基准将待排序序列划分为两个子序以轴值为基准将待排序序列划分为两个子序列后,对每一个子序列分别递归进行排序。列后,对每一个子序列分别递归进行排序。jiij202022-5-26分治法算法算法4.6快速排序快速排序 void QuickSort( (int r , int first, int end) ) if ( (first0) sum=aleft; else sum=0; e
13、lse center=(left+right)/2; /划分划分 leftsum=MaxSum(a, left, center); /对应情况,递归求解对应情况,递归求解 rightsum=MaxSum(a, center+1, right); /对应情况,递归求解对应情况,递归求解302022-5-26分治法 s1=0; lefts=0; /以下对应情况,先求解以下对应情况,先求解s1 for (i=center; i=left; i-) lefts+=ai; if (leftss1) s1=lefts; s2=0; rights=0; /再求解再求解s2 for (j=center+1;
14、js2) s2=rights; sum=s1+s2; /计算情况的最大子段和计算情况的最大子段和 if (sumleftsum) sum=leftsum; /合并,在合并,在sum、leftsum和和rightsum中取较大者中取较大者 if (sum+=1)2(211)(nnnTnnT 从而可得算法从而可得算法4.74.7的时间复杂性为的时间复杂性为O(nlogO(nlog2 2n)n)。322022-5-26分治法4.3.2 棋盘覆盖问题棋盘覆盖问题 在一个在一个2k2k (k0)个方格组成的棋盘中,)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为恰有一个方格与其他方格不同,称
15、该方格为特殊特殊方格方格。棋盘覆盖问题棋盘覆盖问题要求用图(要求用图(b)所示的)所示的4种不种不同形状的同形状的L型骨牌覆盖给定棋盘上除特殊方格以型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且任何外的所有方格,且任何2个个L型骨牌不得重叠覆盖。型骨牌不得重叠覆盖。(a) k=2时的一种棋盘时的一种棋盘 (b) 4种不同形状的种不同形状的L型骨牌型骨牌332022-5-26分治法 分治法求解棋盘覆盖问题的技巧在于划分棋盘,使划分治法求解棋盘覆盖问题的技巧在于划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分
16、解为规模较小的棋盘覆盖问题。殊方格,从而将原问题分解为规模较小的棋盘覆盖问题。 k0 k0时,可将时,可将2k2k2k2k的棋盘划分为的棋盘划分为4 4个个2k-12k-12k-12k-1的子的子棋盘,这样划分后,由于原棋盘只有一个特殊方格,所以,棋盘,这样划分后,由于原棋盘只有一个特殊方格,所以,这这4 4个子棋盘中只有一个子棋盘包含该特殊方格,其余个子棋盘中只有一个子棋盘包含该特殊方格,其余3 3个个子棋盘中没有特殊方格。子棋盘中没有特殊方格。 为了将这为了将这3 3个没有特殊方格的子棋盘转化为特殊棋盘,个没有特殊方格的子棋盘转化为特殊棋盘,以便采用递归方法求解,可以用一个以便采用递归方法
展开阅读全文