- 1、本文档共50页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)