第2章 递归及分治策略(2-例子).pdf

  1. 1、本文档共50页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2.9 线性时间的选择问题 2.9 线性时间的选择问题 给定线性序集中n个元素和一个整数k,1 ≤k ≤n,要求找出这n 个元素中第k小的元素  当k=1,找最小元素  当k=n,找最大元素  当k处于中间的元素,称为中位数 当n为奇数时,中位数只有1个,k=(n+1)/2; 当n为偶数时,中位数有2个,k=n/2, n/2+1 ,可视为两个 中位数(上、下中位数),也可视为这两个中间数的平均值. 1,找最大元素FindMax 算法最坏情况下 的时间复杂性为 O(n) 2.9 线性时间的选择问题 2.9 线性时间的选择问题 2 ,找最大和最小元素FindMaxMin 3,找第二大 2.9 线性时间的选择问题 2.9 线性时间的选择问题 4 ,一般性选择问题 几种思路: (1 )排序法 (2 )堆+ 部分排序:O(n+klogn) 先建最小堆:O(n) 最小堆 弹堆顶元素k次,第k次获得第k小元素:k*O(logn) 当k较小,接近线性效率,但堆的空间较大。 2.9 线性时间的选择问题 2.9 线性时间的选择问题 4 ,一般性选择问题 (3 )堆:O(nlogk) 这种思路是前述(2 )方法的改进: 先建一个长度为k的最大堆,存储n个元素的前k个元素, 最大堆 并假设他们就是最小的k个数,建堆费时O(k); 弹堆顶x ,将后续n-k个元素逐个遍历,和堆顶x 比较,若 比x小,插入并更新堆,若比x大,丢弃; 总耗时最坏:O(k+(n-k)logk) = O(nlogk),当k较小,接近 线性效率,且堆的空间很小(只有k),适合于海量数据查询 且堆的空间很小(只有k),适合于海量数据查询 第k小元素。此方法得益于在堆中,插入、查找等各项操作 第k小元素。 时间复杂度均为logk。 (4 )快速选择算法 最坏情况:O(n),但此处n有个系数,渐进意义上忽略。 2.9 线性时间的选择问题 2.9 线性时间的选择问题 4 ,一般性选择问题 (3 )快速选择算法 templateclass Type Type RandomizedSelect(Type a[],int p,int r,int k) { if (p==r) return a[p]; int i=RandomizedPartition(a,p,r), 算法期望O(n),但 j=i-p+1; 最坏情况O(n2) if (k=j) return RandomizedSelect(a,p,i,k); else return RandomizedSelect(a,i+1,r,k-j); } 2 在最坏情况下,算法randomizedSelect需要O(n )计算时间。 但只要适当选择基准值,可以证明算法randomizedSelect可以 在O(n)平均时间内找出n个输入元素中的第k小元素。 2.9 线性时间的选择问题 2.9 线性时间的选择问题 如果能在线性时间内找到一个划分基准,使得按这个 基准所划分出的2个子数组的长度都至少为原数组长度 的ε倍(0 ε1是某个正常数),那么就可以在最坏情 况下用O(n)时间完成选择任务。 例如,若ε=9/10,算法递归调用所产生的子 数组的长度至少缩短1/10。所以,在最坏情况 下,算法所需的计算时间T(n)满足递归式 T(n) ≤T(9n/10)+O(n) 。由此可得T(n)=O

文档评论(0)

xuefei111 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档