- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(企管)20140518版第二讲_分治策略-不可更改
* * * (2)成对处理输入值,用其中较小者与当前最小值比较, 用较大值与当前最大值比较,每对数据比较3次, 共比较 次。 分治算法举例6:线性时间选择 在有n个元素的集合中找最小值或最大值需比较n-1次。如果利用锦标赛树,其他元素需要比较 次。 (1)分别找出最大值和最小值,比较次数为2(n-1) 同时找到最大值和最小值方法: * T randomizedSelect(T a[], int p, int r, int k) { 如果只有一个元素,将其返回; int i = 随机将线性序列分解为两部分(前小后大); j = 计算前段元素个数; if ( 第k个小的元素位于前段) 采用同样的方法在前段找第k 个小元素; else 采用同样的方法在后段找k-j 个小元素; } p i r j a 问题:给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素。 * Template class T T randomizedSelect(T a[], int p, int r, int k){ if (p == r) return a[p]; int i = randomizedPartition(a, p, r); j = i – p + 1; if ( k = j) return randomizedSelect(a, p, i, k); else return randomizedSelect(a, i+1, r, k-j); } p i r j a * 一种选择支点元素的方法是使用“中间的中间 (median-of-median)” 首先将数组a中的n 个元素分成n/r 组,r 为某一整常数,除了最后一组外,每组都有r个元素。然后通过在每组中对r 个元素进行排序来寻找每组中位于中间位置的元素。最后对所得到的n/r 个中间元素,递归使用选择算法,求得”中间之中间”作为支点元素。 规则: * 如果能在线性时间内找到一个划分基准,使得按这个基 准所划分出的2个子数组的长度都至多为原数组长度的ε 倍(0ε1是某个正常数),就可以在最坏情况下用O(n) 时间完成选择任务。 在最坏情况下,算法randomizedSelect需要O(n2)计算时间。 可以证明,算法randomizedSelect可以在O(n)时间内找出 n个输入元素中的第k小元素。 例如,若ε=9/10,算法递归调用所产生的子数组的长度至少缩短 1/10。所以,在最坏情况下,算法所需的计算时间T(n)满足递归式 T(n)≤T(9n/10)+O(n) 。由此可得T(n)=O(n)。 * P={8,17,4,11, 3,13,6,19,16,5,7,23,22} Q={25} R={31,60,33,51,57,49,35,43,37,52,32,54,41,46,29} 按递增顺序,找出下面29个元素的第18个元素: 8,31,60,33,17,4,51,57,49,35,11,43,37,3,13,52,6,19,25,32,54,16,5, 41,7,23,22,46,29. 举例 (1) 把前面25个元素分为5(=floor(29/5))组: (8,31,60,33,17),(4,51,57,49,35),(11,43,37,3,13),(52,6,19,25,32), (54,16,5,41,7). (2) 提取每一组的中值元素,构成集合{31,49,13,25,16}; (3) 递归地使用算法求取该集合的中值,得到m=25; (4) 根据m=25, 把29个元素划分为3个子数组: * (7) 求取这3组元素的中值元素分别为:{51,43,41}, 这个集合的中值元素是43; 例子(续) (5) 由于|P|=13,|Q|=1,k=18,所以放弃P,Q,使 k=18-13-1=4,对R递归地执行本算法; (6) 将R划分成3(floor(15/5))组: {31,60,33,51,57},{49,35,43,37,52},{32,54,41,46,29} (8) 根据43将R划分成3组: {31, 33, 35,37,32, 41, 29},{43},{60, 51,57, 49, 52,54, 46} * (12) 因为k=4,而第一、第二个子数组的元素个数为3,所以33即为所求取的第18个小元素。 例子(续) (9) 因为k=4,第一个子数组的元素个数大于k,所以放弃后面两个子数组,以k=4对第一个子数组递归调用本算法; (10)将这个子数组分成5个
文档评论(0)