第五章 减治法剖析课件.ppt

上传人:小飞机 文档编号:1855922 上传时间:2022-12-22 格式:PPT 页数:57 大小:496KB
返回 下载 相关 举报
第五章 减治法剖析课件.ppt_第1页
第1页 / 共57页
第五章 减治法剖析课件.ppt_第2页
第2页 / 共57页
第五章 减治法剖析课件.ppt_第3页
第3页 / 共57页
第五章 减治法剖析课件.ppt_第4页
第4页 / 共57页
第五章 减治法剖析课件.ppt_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《第五章 减治法剖析课件.ppt》由会员分享,可在线阅读,更多相关《第五章 减治法剖析课件.ppt(57页珍藏版)》请在三一办公上搜索。

1、12/22/2022,1,第5章 减治法,减治法的基本思想将规模为n的问题递减为规模为n-1、n/c或n-k的子问题,反复递减后对子问题分别求解,再建立子问题的解与原问题的解的关系。与分治法的区别于联系?Divide-and-Conquer VS Decrease-and-Conquer,12/22/2022,2,减常数(如1) :每此迭代规模减小nn-1,减治法-减常变量,12/22/2022,3,减因子(如1/2):每此迭代规模减半n n/2,减治法-减常因子,与分治法的区别?,12/22/2022,4,减治法-减可变规模,每此迭代减小的规模不同gcd(m,n)=gcd(m,m mod n

2、),12/22/2022,5,主要内容,减常量:5.1 插入排序 5.2 深度优先查找与广度优先查找5.3 拓扑排序5.4 生成组合对象的算法减常因子算法:5.5减可变规模算法:5.6,12/22/2022,6,如何用减一法对一个数组A0.n-1排序?也就是如何建立n规模与n-1规模之间的关系?假设n-1规模的数组A0.n-2已经解决,则需要考虑元素An-1,在这个有序数组中处于何处?根据在A0.n-2中寻找An-1插入使用方法的不同分为:直接插入排序、折半插入排序,5.1 插入排序,12/22/2022,7,5.1 插入排序-示例,待排序序列89,45,68,90,29,34,17插入过程:

3、 89 不需比较 45,89 45,68,89 45,68, 89,90 29,45,68, 89,90 29,34,45,68 89, 90 17,29,34,45,68, 89, 90 插入次数=n-1=6 比较次数=?,12/22/2022,8,ALGORITHM InsertionSort( A0.n-1 )/ 对给定序列进行直接插入排序/ 输入:大小为n的无序序列A/ 输出:按非递减排列的序列Afor i 1 to n-1 dotemp Aij i-1while j 0 and Aj temp doAj+1 Ajj j 1Aj+1 temp,5.1 插入排序-伪代码,12/22/20

4、22,9,基本操作:比较最坏的情形? 严格递减的数组,每次插入,需比较已插入的所有元素,此时,第i次插入比较i个元素,故最好的情形? 升序排列,每次插入只需比较一次,5.1 插入排序-效率分析,12/22/2022,10,平均效率的精确分析基于对无序元素的研究,对于随机序列的数组,,5.1 插入排序-效率分析,12/22/2022,11,排序算法-时间复杂度小节,插入排序最差(n2) 最优 (n) 平均 (n2)合并排序最差(nlog2n)快速排序最优(nlog2n) 最差(n2) 平均(1.38nlog2n)选择排序(n2)冒泡排序(n2),遇到基本有序数组表现优异性能,可结合快速排序,12

5、/22/2022,12,5.2.1 深度优先查找-基本思想,基本思想访问一个节点A若A有未访问相邻节点,访问一个与A相邻节点B以B为起点进行DFS否则回退右图DFS输出序列是?a-c-d-f-b-e-g-h-i-j,12/22/2022,13,5.2.1 深度优先查找-伪代码,DFS(G)count =0/记录这是第几个访问的节点mark each vertex with 0/标记为 unvisitedfor each vertex v V doif v is marked with 0 dfs(v)dfs(v)count = count + 1mark v with countfor eac

6、h vertex w adjacent to v doif w is marked with 0 dfs(w),12/22/2022,14,在深度优先遍历时需要使用到什么辅助结构?写出出栈和入栈的过程,5.2.1 深度优先查找-堆栈过程,12/22/2022,15,5.2.1 深度优先查找-效率,深度优先搜索的效率与图的表示有关吗?对邻接矩阵表示的图:遍历的效率为 ( V 2) 对邻接链表表示的图:遍历的效率为 ( V + E ),12/22/2022,16,5.2.2 广度优先查找-基本思想,基本思想访问一个节点A若A有未访问相邻节点,访问所有与A相邻节点以一个相邻起点进行DFS否则回退一个

7、BFS输出序列是?a-c-d-e-f-b-g-h-j-i,12/22/2022,17,5.2.2 广度优先查找-伪代码,BFS(G) count =0 mark each vertex with 0 for each vertex v V do bfs(v)bfs(v)count = count + 1mark v with countinitialize queue with vwhile queue is not empty doa = front of queuefor each vertex w adjacent to a doif w is marked with 0 count =

8、 count + 1mark w with countadd w to the end of the queueremove a from the front of the queue,12/22/2022,18,5.2.2 广度优先查找-效率,广度优先搜索的效率与图的表示有关吗?对邻接矩阵表示的图:遍历的效率为 ( V 2) 对邻接链表表示的图:遍历的效率为 ( V + E ),12/22/2022,19,( V + E ),( V + E ),( V 2),( V 2),5.2 小结,12/22/2022,20,5.3 拓扑排序,背景大学课程里面的学习顺序软件开发里面各个任务的先后顺序(G

9、antt图)拓扑排序问题: 对给定的无环有向图,要求按照某种顺序列出它的顶点序列,使图的每一条边的起点总在结束顶点之前。,12/22/2022,21,DFS序列: C1-C3-C4-C5- -C2出栈序列: C5-C4-C3-C1-C2拓扑排序: C2-C1-C3-C4-C5思考为什么这个算法是有效的?,5.3 拓扑排序-DFS堆栈的方法,12/22/2022,22,5.3 拓扑排序-减一法直接实现,N规模和n-1规模如何建立联系?每次去掉一个源(没有输入边的顶点),12/22/2022,23,5.3 拓扑排序-减一法直接实现,N规模和n-1规模如何建立联系?每次去掉一个源(没有输入边的顶点)

10、,C3,C2,C5,C4,C1,12/22/2022,24,5.3 拓扑排序-减一法直接实现,N规模和n-1规模如何建立联系?每次去掉一个源(没有输入边的顶点),C3,C5,C4,C1,C2,12/22/2022,25,5.3 拓扑排序-减一法直接实现,N规模和n-1规模如何建立联系?每次去掉一个源(没有输入边的顶点),C5,C4,C1,C2,C3,12/22/2022,26,5.3 拓扑排序-减一法直接实现,N规模和n-1规模如何建立联系?每次去掉一个源(没有输入边的顶点),C5,C1,C2,C3,C4,C5,12/22/2022,27,5.4.1 生成排列,排列问题指的是对于给定的多个元素

11、求其中各种可能的序列。为了简单起见,这里仅仅考虑1到n之间的整数的排列问题。三种生成方法:(1)插入法 (2)Johnson-Trotter 法(3)字典顺序法,12/22/2022,28,5.4.1 生成排列-插入法,如何用减一法构造n规模与n-1规模问题之间的关系?将第n个数插入到(n-1)!个排列的n个可能位置中去。举例:求n=3的排列在n=2的排列中插入3,在n=1的排列中插入2。构造过程(从底向上):在 1 中从右到左插入2得到 12,21在 12 中从右到左插入3得到 123,132,312在 21 中从右到左插入3得到 213,231,321于是得 123,132,312,213

12、,231,321,12/22/2022,29,5.4.1 生成排列-插入法,优点满足最小变化的要求缺点生成多少项了?1+2!+3! + n!,12/22/2022,30,5.4.1 生成排列-JT,是否可以不产生1,2,3n-1的这些中间结果?Johnson-Trotter算法就是其中一种。利用这一算法求得的排列序列还是相邻序列变化最小的一个序列集合,也就是说下一个序列与上一个序列仅仅交换了两个元素的位置 。,12/22/2022,31,在排列的每一分量上画一个箭头。移动元素:如果分量k 的箭头指向一个相邻的较小元素,则该分量在排列中是移动的。While 存在可移动元素求最大的移动整数k,不断

13、移动元素,直到没有元素可移动为止,掉转所有大于k 的整数方向。例n=3,从123开始:,5.4.1 生成排列-JT,12/22/2022,32,5.4.1 生成排列-字典序,尽管Johnson-Trotter算法非常高效,但是似乎不是那么直观,不太符合人们的思维习惯。事实上比较自然的算法称为“字典排序(lexicographic order)算法”,它是根据单词在字典中的排列顺序得到的算法。,12/22/2022,33,5.4.1 生成排列-字典序,基本思想:从右到左扫描一个当前排列,寻找第一对连续的元素ai和ai+1,aiai+1在ai+1及后面的元素中寻找大于ai的最小数字放到i的位置上a

14、i , ai+1 ,aj按升序从i+1位置排到n,在1,2,3中按字典顺序选择: 123 132 213 231 312 321,12/22/2022,34,5.4.2 生成子集-减一法,考虑如何用减一法生成规模为n的集合的所有子集?如何建立n规模和n-1规模的关系在n-1规模集合的所有子集中添加第n个元素,12/22/2022,35,5.4.2 生成子集-减一法,例n=3,方法:在n=2的幂集中加入元素3,在n=1的幂集中加入元素2在n=0的幂集中加入元素1算法过程 , 1 /n=1 , 1, 2, 1,2 /加入元素2 , 1, 2, 1,2, 3, 1,3, 2,3, 1,2,3/加入元

15、素3,12/22/2022,36,5.4.2 生成子集-位串法,这是一个直接解决该问题的方法,可以对较小的集合生成幂集例n=3,元素为a1,a2,a3 方法: 每一个子集与一个3位二进制串b1b2b3对应,ai属于该子集时,bi=1,否则 bi=0二进制串: 000, 001, 010, 011, 100, 101, 110, 111对应子集: , a3, a2, a2,a3, a1, a1,a3, a1,a2, a1,a2,a3,12/22/2022,37,5.1-5.4小结(减常量),核心思想建立一座桥梁,沟通规模为n-1的问题的解和规模为n的问题的解。,12/22/2022,38,5.5

16、 减常因子法,已有例子折半查找、用平方求幂注意:不要指望有许多这种类型的例子,因为这种算法的效率常常是对数的,速度非常快,并不会时常出现,不以2为因子化简的情况更是少之又少。,12/22/2022,39,5.5 减常因子法-假币问题,1、假币问题 有n个金币,其中一个是假币。这个假币的重量比真币的重量要轻一点,所有n-1个金币的重量是一样的。现在你有一架天平,设计高效的算法(用最少的使用天平次数)找出那个假的金币。 蛮力法?时间效率类型是?减治法?可类比于折半查找。,12/22/2022,40,1、用减治法(减半) 把n个硬币分为两堆,每堆n/2个,每次称一堆。请写出递推式 易见 W(1)=0

17、 W(n)=W(n/2)+1 解得 W(n)= log2n,5.5 减常因子法-假币问题,12/22/2022,41,2、用减治法(减n/3) 把n个硬币分为三堆,每堆n/3个,每次称任意二堆。 易见 W(1)=0 W(n)=W(n/3)+a 解得 W(n)= log3n 结果比减半法更好。是否分堆数越多越好?,5.5.1 减常因子法-假币问题,12/22/2022,42,n m 分析 . 50 65 25 130 12 260 +130 6 520 3 1040 1 2080 +1040 2080 +2080 = 3250,整个算法只包括折半加倍相加,5.5.2 减常因子法-俄式乘法,以n为

18、实例规模的度量,则一次变换以后规模为n/2,12/22/2022,43,5.5.3 减常因子法-约瑟夫斯问题,约瑟夫斯是公元1世纪的犹太历史学家,他领导了反抗罗马人的武装起义,但是失败了。 他和四十名犹太士兵被罗马人围困在一个山洞中。这四十个士兵宁死不屈,决定杀身成仁。但约瑟夫斯不想,但又不便公开反对。 于是提出一个方法,就是四十一个人站成一个圈,从某人开始数起,凡数到三的人就让大家成全他升天,这样下去直到剩下最后一个人,这个人就自杀。 约瑟夫斯就挑选了第31号的位置。结果所有人都死了,剩下他和倒数第二个人投降了罗马人。这也是约瑟夫斯问题的最初提法。,12/22/2022,44,5.5.3 约

19、瑟夫斯问题,约瑟夫斯问题的一般提法:设有n个以1、2、n编号的人,按编号顺序围成一圈,从1号开始报数,每数到m就淘汰一人,问最后被淘汰的人是几号呢?令L(n, m)为上述最后被淘汰的人的号码,即幸存者的初始位置。则可以将最初的约瑟夫斯问题写成L(41, 3)31。,12/22/2022,45,5.5.3 约瑟夫斯问题,减治法的体现在于,整个圆圈走一遍后,规模减小1m如m=2,走一圈后生成同样问题的规模减1/2的实例m=3,走一圈后生成同样问题的规模减1/3的实例考虑m=2时,如何得到幸存者的初始位置?当n为偶数时,某人原来位置=新位置2-1 幸存者的初始位置L(n,2)=2L(n/2,2)-1

20、当n为奇数时,L(n,2)=2L(n-1)/2,2)+1解这两个递推式获得幸存者的初始位置的表达式。,12/22/2022,46,5.5.3 约瑟夫斯问题,还可使用前向替代法,找出一个模式即L(n,2)有什么规律?L(2,2)=1=20+1 2= 210L(3,2)=3=21+1 3= 211L(4,2)=1=20+1 4= 220L(5,2)=3=21+1 5= 221 L(6,2)=5=22+1 6= 222 L(7,2)=7=23+1 7= 223 L(13,2)=11=25+1 13= 235 L(n,2)2b1 n= 2ab (而a必须尽可能大) 例如当n=100,则100可以写成2

21、568,也可以写成2636,但是不能再写成27的了,所以,a=6,而b=36。,12/22/2022,47,5.5.3 约瑟夫斯问题,当m3、4、时,有没有公式呢?存在一个L(n,m) 递推公式: L(1,m)1 L(k1,m)L(k,m)m (modn+1),12/22/2022,48,5.5.3 约瑟夫斯问题-更多例子,第一题,猴子选大王:有M个猴子围成一圈,每个有一个编号,编号从1到M。打算从中选出一个大王。经过协商,决定选大王的规则如下:从第一个开始,每隔N个,数到的猴子出圈,最后剩下来的就是大王。要求:从键盘输入M,N,编程计算哪一个编号的猴子成为大王。第二题:设有N个人围成一圏,并

22、且按照顺时针方向从1到N编号,由第S个人开始进行从1到M报数,报数到第M个人时,此人出圏,再从下一个人重新开始从1到M报数,如此进行下去,直到所有的人都出圏为止。现在要求编程按照出圏的顺序,打印这N个人的顺序表。,12/22/2022,49,5.5.3 约瑟夫斯问题-更多例子,第三题,狐狸捉兔子:围绕着山顶有个洞,狐狸要吃兔子,兔子说:“可以,但必须找到我, 我就藏身于这十个洞中,你从号洞出发,先到号洞找,第二次隔个 洞找,第三次隔个洞找,以后如此类推,次数不限。”但狐狸从早到晚进进出出了次,仍没有找到兔子。问兔子究竟藏在哪个洞里?第四题,慈善的约瑟夫:现在老约瑟夫将组织一个皆大欢喜的新游戏,

23、假设N个人站成一圈,从第1人开始交替的去掉游戏者, 但只是暂时去掉,直到最后剩下唯一的幸存者为止。幸存者选出后,所有比幸存者号码高的人每人得到1个金币,永久性离开。其余剩下的将重复以上的游戏过程, 比幸存者号码主的人每人得到1个金币后离开。经过这们的过程后,一旦人数不再减少,则最后剩下的那些人将得到2个金币。请你计算一下老约瑟夫一共要付出多 少钱?,12/22/2022,50,5.5.3 约瑟夫斯问题-更多例子,第五题:50枚棋子围成圆圈,编上号码1,2,3,每隔一枚棋子取出一枚,要求最后留下的一枚棋子的号码是42,那该从几号棋子开始取呢?第六题,变形猴子选大王:有n个猴子选大王,选举办法如下

24、:从头到尾1,2,3报数,凡报到3的退出,余下的从尾到头1,2,3报数,凡报3的退出。如此类推,当剩下两只猴子时,取这时报1的为王,若想当猴王,请问当初应站在什么位置?,12/22/2022,51,5.6.2 减可变规模算法-选择问题,选择问题求一个n数组的第k个最小元素。如数组1,2,3,4,5,6,7,8,9求中位数直观的方法?排序,12/22/2022,52,5.6.2 减可变规模算法-选择问题,数组4,1,10,9,7,12,8,2,15,求中值元素即求第k= 9/2=5小的元素。使用快速排序中的分区算法先数组4,1,10,9,7,12,8,2,15分区, 中轴=4 1,2,4, 9,

25、7,12,8,10,15, s=3因sk, 在8,7中找7, 8 此时,s=k=5, 中值是8,12/22/2022,53,5.6.2 减可变规模算法-选择问题,平均情况下:比快速排序高效严格的数学分析表明,平均情况下的效率和每次都消减一半情况下的效率是完全相同的。每次都消减一半的递推式是?C(n)=C(n/2)+(n+1)C(n) (n)最差情况?C(n) (n2),12/22/2022,54,5.6.2 减可变规模算法-插值查找,有序数组2,5,12,23,39,50,66,78,90,100,150用折半查找12如何做?查找150如何做?查找时考虑key的特点但如何确定key是偏向于数组的左边还是右边?,12/22/2022,55,5.6.2 减可变规模算法-插值查找,12/22/2022,56,5.6.2 减可变规模算法-插值查找,对于小的文件折半查找可能更好一些对于更大的文件和那些访问成本非常高的的应用,插值查找更值得考虑。平均来说插值查找的键值比较次数log2log2n+1,12/22/2022,57,作业,减一法实现拓扑排序调用格式 topologysort.exe graph.txt,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号