网站大量收购闲置独家精品文档,联系QQ:2885784924

分治法之选择问题-(一).pptVIP

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
分治法之选择问题-(一)

1. 问题描述 在n个元素的表a[1:n]中确定第k小元素,1≤k≤n。 2. 设计思路 利用Partition过程。在第一次划分后划分元素v测定在a[j]的位置上,则有j-1个元素小于或等于a[j],且有n-j个元素大于或等于a[j]。此时, 若k=j,则a[j]即是第k小元素;否则, 若kj,则a[1:n]中的第k小元素将出现在a[1:j-1]中, 且仍是a[1:j-1]中的第k小元素; 若kj,则a[1:n]中的第k小元素将出现在a[j+1:n], 是a[j+1:n]中的第k-j小元素。 * 选择问题 利用Partition实现的选择算法 public static void Select(int n,int k) {//在数组a[1],…,a[n]中找第k小元素s并把它放在位置k,假设1≤k≤n。 //将剩下的元素按如下方式排列,使a[k]=t,对于1≤mk,有a[m]≤t;对于km≤n,有a[m]≥t。a[n+1]=+∞ int m,r,j; m=1;r=n+1;a[n+1]=10000; while(true) //每当进入这一循环时,1≤m≤k≤r≤n+1 { j=r; //将剩余元素的最大下标加1后给j j=Partition(m,j); //返回j,它使得a[j]是第j小的值 if(kj) r=j; //j是新的上界 else if(k==j) return; else m=j+1; //j+1是新的下界 } } 利用Partition实现的选择算法实例分析 算法复杂度分析 假设 ① a中的元素互异; ② 随机选取划分元素,且选择a[m:p-1]中任一元素作为划分元素的概率相同。 分析 在Select中每次调用Partition(m,j),所需的元素比较次是 j-m+1。 在执行一次Partition后,或者找到第k小元素,或者将在缩小的子集(a[m,k-1]或a[k+1,j])中继续查找。缩小的子集的元素数将至少比上一次划分的元素数少1。 最坏情况时间 Select的最坏情况时间是O( ) Select的平均情况时间是O(n) 最坏情况下的特例: 输入a恰好使对Partition的第i次调用选用的划分 元素是第i小元素,而k=n。 此时,(区间下界)m随着Partition的每一次调用而仅增加1,j保持不变。 Partition最终需要调用n次。 则n次调用的时间总量是: 最坏情况时间是O(n)的选择算法 基本思想:精心挑选划分元素v 方法:二次取中间值 目的:使v比一部分元素小比另一部分元素大 使用二次取中规则的选择算法的说明性描述 public static int Select2(int a[],int k,int n) { //在集合a中找第k小元素 ① 若n≤r,则采用插入法直接对a分类并返回第k小元素。 ② 把a分成大小为r的个子集合,忽略剩余的元素。 ③ 设 是上面 个子集合的中间值的集合。 ④ ⑤ 用Partition划分a,v作为划分元素。 ⑥ 假设v在位置j。 ⑦ case k=j: return(v); kj: 设S是a[1:j-1]中元素的集合 return(Select2(S,k,j-1)) else:设R是a[j+1:n]中元素的集合 return(Select2(R,k-j,n-j)) } Select2的待解决问题 算法中需要解决的两个问题 1) 如何确定子集合的中间值 当r较小时,采用InsertionSort(a,i,j)直接对每组的r个元素分类,在分类好的序列中,中间元素即为当前r个元素中的中间位置下标对应的元素。 2) 如何保存 个子集合的中间值 注:各组找到的中间元素值将调整到数组a的前部,连续保存,从而可用递归

文档评论(0)

zijingling + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档