算法设计与分析(王佳)03分治策略.pptVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
5.5.1? 分治法求解 设原表长度为n,假定经过一趟分划,分成两个左右子表,其中左子表是主元及其左边元素的子表,设其长度为p,右子表是主元右边元素的子表。那么,若k=p,则主元就是第k小元素;否则若kp ,第k小元素必定在左子表中,需求解的子问题成为在左子表中求第k小元素;若kp,则第k小元素必定在右子表中,需求解的子问题成为在右子表中求第k-p小元素。 5.5.2? 随机选择主元 随机选主元算法 假定表中元素各不相同,并且随机选择主元,即在下标区间[left,right]中随机选择一个下标r,以该下标处的元素为主元。 【程序5-13】Select函数 template class T ResultCode SortableListT::Select1(T x,int k) { if(n=0||kn||k=0) return OutOfBounds; int left=0, right=n; l[n] = INFTY; do { int j=rand()% (right-left+1)+left; Swap(left,j); j=Partition(left, right); if (k==j+1) {x=l[j];return Success;} else if (kj+1) right=j; else left=j+1; } while (true); } 定理5-8 程序5-13的Select算法的平均时间A(n)=O(n)。 算法的最坏情况时间复杂度O(n2) 。 5.5.3? 线性时间选择算法 改进的选择算法采用二次取中法(median of medians rule)确定主元 一个较好的基准划分步骤 步骤(如图所示): 将n个输入元素划分成?n/5?个组,每组5个元素,只可能有一个组不是5个元素。用任意一种排序算法,将每组中的元素排好序,并取出每组的中位数,共?n/5?个。 递归调用select来找出这?n/5?个元素的中位数。如果?n/5?是偶数,就找它的2个中位数中较大的一个。以这个元素作为划分基准。 说明: 设所有元素互不相同。在这种情况下,找出的基准x至少比3(n-5)/10个元素大,因为在每一组中有2个元素小于本组的中位数,而n/5个中位数中又有(n-5)/10个小于基准x(如图)。同理,基准x也至少比3(n-5)/10个元素小。而当n≥75时,3(n-5)/10≥n/4所以按此基准划分所得的2个子数组的长度都至少缩短1/4。 图2-7 选择划分基准 其中,n个元素用小圆点表示,    空心圆点为每组元素的中位数;    x为中位数的中位数;    箭头由较大元素指向较小元素。 只要等于基准的元素不太多,利用这个基准来划分的两个数组的大小就不会相差太远。 aix n/5+(n/5-1)/2 3(n-5)/10 aix n/5+(n/5-1)/2 3(n-5)/10 【程序5-14】 线性时间选择算法 ResultCode SortableListT::Select(T x,int k) { if(n=0||kn||k=0) return OutOfBounds; int j=Select(k,0,n-1,5); x=l[j];return Success; } template class T int SortableListT::Select(int k, int left,int right,int r) { int n=right-left+1; if (n=r){ InsertSort(left,right); return left+k-1; } for (int i=1;i=n/r;i++){ InsertSort(left+(i-1)*r,left+i*r-1); Swap(left+i-1, left+(i-1)*r+Ceil(r,2)-1); } int j=Select(Ceil(n/r,2),

文档评论(0)

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

文档有任何问题,请私信留言,会第一时间解决。

版权声明书
用户编号:7043023136000000

1亿VIP精品文档

相关文档