算法分治策略课件.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《算法分治策略课件.pptx》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 分治 策略 课件
- 资源描述:
-
1、 第三章第三章 分治算法分治算法一、一、分治算法基本思想分治算法基本思想二、二、典型典型实例实例三、三、分分治算法的分析技术治算法的分析技术四、四、难解问题难解问题问题:找出伪币找出伪币l 给你一个装有给你一个装有1 6枚硬币的袋子。枚硬币的袋子。1 6枚硬币中有枚硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币一个是伪造的,并且那个伪造的硬币比真的硬币要轻一些。你的任务是找出这枚伪造的硬币。要轻一些。你的任务是找出这枚伪造的硬币。l 为了帮助你完成这一任务,将提供一台可用来比为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,比如天平。利用这台仪较两组硬币重量的仪器,比如天平。
2、利用这台仪器,可以知道两组硬币的重量是否相同。器,可以知道两组硬币的重量是否相同。方法1l 任意取1枚硬币,与其他硬币进行比较,若发现轻者,这那枚为伪币。最多可能有15次比较。方法2l 将硬币分为8组,每组2个,每组比较一次,若发现轻的,则为伪币。最多可能有8次比较。方法3分析l上述三种方法上述三种方法,分别需要比较分别需要比较15次次,8次次,4次次,那么形成比较次数差异的根本原因在哪里那么形成比较次数差异的根本原因在哪里?l方法方法1:每枚硬币都至少进行了一次比较每枚硬币都至少进行了一次比较,而而有一枚硬币进行了有一枚硬币进行了15次比较次比较l方法方法2:每一枚硬币只进行了一次比较每一枚
3、硬币只进行了一次比较l方法方法3:将硬币分为两组后一次比较可以将将硬币分为两组后一次比较可以将硬币的范围缩小到了原来的一半硬币的范围缩小到了原来的一半,这样充分这样充分地利用了只有地利用了只有1枚伪币的基本性质。枚伪币的基本性质。一、分治策略的基本思想一、分治策略的基本思想 1 基本思想基本思想 对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小),则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并,得到原问题的解。这种算法设计策略叫做分治法(divide and conquer)。分治法在每一层递归上
4、由三个步骤组成:(1)划分(divide):将原问题分解为若干规模较小、相互独立、与原问题形式相同的子问题。(2)解决(conquer):若子问题规模较小,则直接求解;否则递归求解各子问题。(3)合并(combine):将各子问题的解合并为原问题的解。分治思想分治思想问题问题S问题问题S问题问题SS的解的解问题问题S1问题问题S2问题问题Si问题问题SnS1的解的解S2的解的解Si的解的解Sn的解的解问题的分解问题的分解子集解的合并子集解的合并子问题求子问题求解解分治策略的解题思路 if 问题不可分问题不可分then begin 直接求解;直接求解;返回问题的解;返回问题的解;end else
5、 begin 对原问题进行分治;对原问题进行分治;递归对每一个分治的部分求解递归对每一个分治的部分求解 归并整个问题,得出全问题的解;归并整个问题,得出全问题的解;end;n该问题的规模缩小到一定的程度就可以容易地解决;该问题的规模缩小到一定的程度就可以容易地解决;n该问题可以分解为若干个规模较小的相同问题,即该该问题可以分解为若干个规模较小的相同问题,即该问题具有问题具有最优子结构性质最优子结构性质n利用该问题分解出的子问题的解可以合并为该问题的利用该问题分解出的子问题的解可以合并为该问题的解;解;n该问题所分解出的各个子问题是相互独立的,即子问该问题所分解出的各个子问题是相互独立的,即子问
6、题之间不包含公共的子问题。题之间不包含公共的子问题。因为问题的计算复杂性一般是随着问题规模的增加而增加,因此大部分问题满足这个特征。这条特征是应用分治法的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用能否利用分治法完全取决于问题是否具有这条特征,如果具备了前两条特征,而不具备第三条特征,则可以考虑贪心算法贪心算法或动态规划动态规划。这条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然也可用分治法,但一般用动态规划动态规划较好。二分搜索技术分析:如果n=1即只有一个元素,则只要比较这个元素和x就可以确定x是否在表中。因此这
7、个问题满足分治法的第一个适用条件分析:比较x和a的中间元素amid,若x=amid,则x在L中的位置就是mid;如果xai,同理我们只要在amid的后面查找x即可。无论是在前面还是后面查找x,其方法都和在a中查找x一样,只不过是查找的规模缩小了。这就说明了此问题满足分治法的第二个和第三个适用条件。分析:很显然此问题分解出的子问题相互独立,即在ai的前面或后面查找x是独立的子问题,因此满足分治法的第四个适用条件。给定已按升序排好序的给定已按升序排好序的n个元素个元素a0:n-1,现要在这,现要在这n个元素个元素中找出一特定元素中找出一特定元素x。分析:分析:该问题的规模缩小到一定的程度就可以容易
8、地解决;该问题可以分解为若干个规模较小的相同问题;分解出的子问题的解可以合并为原问题的解;分解出的各个子问题是相互独立的。给定已按升序排好序的给定已按升序排好序的n个元素个元素a0:n-1,现要在这,现要在这n个元素个元素中找出一特定元素中找出一特定元素x。据此容易设计出二分搜索算法二分搜索算法:public static int binarySearch(int a,int x,int n)/在 a0=a1=.=an-1 中搜索 x /找到x返回其在数组中的位置,否则返回-1 int left=0;int right=n-1;while(left amiddle)left=middle+1;
9、else right=middle-1;return-1;/未找到x 算法复杂度分析:算法复杂度分析:每执行一次算法的while循环,待搜索数组的大小减少一半。因此,在最坏情况下,while循环被执行了O(log2n)次。循环体内运算需要O(1)时间,因此整个算法在最坏情况下的计算时间复杂性为O(log2n)。二分搜索技术二分搜索技术v算法复杂度分析:v二分搜索算法在最坏情况下的计算时间复杂性为O(log2n)。复杂度分析复杂度分析T(n)=O(log2n)11)2/()1()(nnbnTOnTv人们从大量实践中发现,在用分治法设计算法时,最好使子问题的规模大致相同。即将一个问题分成大小相等的
10、k个子问题的处理方法是行之有效的。这种使子问题规模大致相等的做法是出自一种平衡(balancing)子问题的思想,它几乎总是比子问题规模不等的做法要好。基本思想:基本思想:将待排序元素分成大小大致相同的将待排序元素分成大小大致相同的2个子集合,分个子集合,分别对别对2个子集合进行排序,最终将排好序的子集合合并成为所个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。要求的排好序的集合。二、分治算法的经典实例合合并排序1.合并排序合并排序8 3 2 9 7 1 5 48 3 2 97 1 5 48 32 97 15 4832971543 82 91 74 52 3 8 91 4
11、5 71 2 3 4 5 7 8 9基本思想:基本思想:将待排序元素分成大小大致相同的将待排序元素分成大小大致相同的2个子集合,分个子集合,分别对别对2个子集合进行排序,最终将排好序的子集合合并成为所个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。要求的排好序的集合。void MergeSort(Type a,int left,int right)if(left1)copy A0.n/2-1 to B0.n/2-1;copy An/2.n-1 to C0.n/2-1;Mergesort(B0.n/2-1);Mergesort(C0.n/2-1);Merge(B,C,A);算
12、法算法 Merge(B0.p-1,C0.q-1),A0.p+q-1)/将两个有序数组合并成一个有序数组将两个有序数组合并成一个有序数组/输入:两个有序数组输入:两个有序数组B0.p-1和和C0.q-1/输出:非降序列数组输出:非降序列数组A-0.p+q-1i0;j0;k0;while(ip and j1当当n=2k时,可得时,可得T(n)=2(2T(n/4)+n/2)+n =4T(n/4)+2n =4(2T(n/8)+n/4)+2n =2kT(1)+kn =nlogn如果如果2kn2k+1,有有T(n)T(2k+1),有,有T(n)=(nlogn)Memory Time 冒泡300K7483M
13、S合并684K171MS思考v当实例较少时,合并排序的效率如何?v合并排序的空间效率如何?v合并排序对特殊数据是否会退化?v在划分子问题时是否可以3等分,如果可以,效率如何?&最坏时间复杂度:最坏时间复杂度:O(nlogn)&平均时间复杂度:平均时间复杂度:O(nlogn)&辅助空间:辅助空间:O(n)合并排序2.快速排序v基本思想 选取A的某个元素t=As,然后将其他元素重新排列,使A0.n-1中所有在t以前出现的元素都小于或等于t,而在t之后出现的元素都大于或等于t。A0A1As-1AsAs+1An-1t划分元素An-1AktAjA1A0经过一次划分后经过一次划分后每个元素都小于或等于t每
14、个元素都大于或等于t划分的实现p全部pp.p全部 p ijp全部p p p全部 p i=jp全部p=p全部 p ij划分元素(中轴)的选取:划分元素(中轴)的选取:可以随机选取,最简单的选择策略是数组第一个元素可以随机选取,最简单的选择策略是数组第一个元素划分的实现思想划分的实现思想同时从左、右开始扫描,左边找到一个比划分元素大的,右边找到同时从左、右开始扫描,左边找到一个比划分元素大的,右边找到一个比划分元素小的,然后交换两个元素的位置。一个比划分元素小的,然后交换两个元素的位置。27划分实例划分实例 27 99 0 8 13 64 86 16 7 10 88 25 90 i j 27 25
15、 0 8 13 64 86 16 7 10 88 99 90 i j 27 25 0 8 13 10 86 16 7 64 88 99 90 i j 27 25 0 8 13 10 7 16 86 64 88 99 90 j i 16 25 0 8 13 10 7 27 86 64 88 99 90 快速排序算法算法 Quicksort(Al.r)/用Quicksort对子数组排序/输入:数组A0.n-1中的子数组/输出:非降序的子数组Al.rif(l1Tbest(n)=(nlogn)Tworst(n)=(n+1)+n+(n-1)+.+3=(n2)Tavg(n)=0n=0,1(n+1)+Tav
展开阅读全文