快速选择(quick select) + 线性时间选择(linear-time select) - 求出n个数中第k大的数
来源:互联网 发布:java离线地图开发 编辑:程序博客网 时间:2024/04/30 10:30
原文链接:http://blog.csdn.net/jiyanfeng1/article/details/8543855
利用快速排序中partition函数,很容易求出n个数中第k大的数,因此在划分后如下图。
左半(包括q)有j = q - p + 1个元素。如果k < j,只需要在左半找第k大元素;如果k > j,需要在右半找第k - j大元素。可以证明,期望时间复杂度为O(n)。
int partition ( int p , int q){int x = a[p], i = p;for(j = p +1; j <= q; j ++)if(a[j] <= x) swap (a[++i], a[j]);swap (a[p], a[i]);return i;}int select ( int p , int r , int k){if(p == r) return p;int i = p + rand()%(r–p+1); swap (a[i], a[p]);int q = partition (p , r);int j = q– p + 1;if(k == j) return q;else if(k < j) return select (p , q , k);else select (q+1 , r , k-j);}
它的思想是:pivot不是随机选择,而是采取某种确定性的策略,使得每次递归调用后保证长度至少缩短为原来的a倍(a < 1)。这样,T(n)<= T(an)+O(n),由主定理得T(n)=O(n)。
如图8.1.2所示,把所有元素分成5个一组共约n/5组,每组用暴力法求出中位数(图中为中心行白点所示),一共有n/5个中位数。用递归法求出这n/5个数的中位数x,则所有k个中位数中至少有约n/10个数比x小。由于每个中位数在自己组中至少有3个数不比它大(也就不会比x大),因此至少有3(n/10) = 0.3n个数比x小。更精细的分析指出,当n>=75时至少有n/4个数比x小。同理,也至少有n/4个数比x大。求n/5个数的中位数需要T(n/5)的时间,而划分后的选择不超过T(3n/4),因此T(n)>=T(n/5)+T(3n/4)+O(1),解为T(n)=O(n)。
0 0
- 快速选择(quick select) + 线性时间选择(linear-time select) - 求出n个数中第k大的数
- 快速选择(quick select) + 线性时间选择(linear-time select) - 求出n个数中第k大的数
- Quick-Select 1亿个数快速求第K小的数 分治法
- 线性选择 求n个数中第k小数
- 求n个数中第k大的数、前K大的数、快速排序
- 第K小的数 快速排序 选择前K大O(n)
- 寻找数组中第k小的数:平均情况下时间复杂度为O(n)的快速选择算法
- poj 2388 Who's in the Middle 第K大的数 线性时间选择
- 选择问题——N个数中选择第K个最大数
- 求n个数中第k大的数、快速排序
- 从M个数中选择前N大的数
- 查找N个数中第K大的数
- 查找N个数中第K大的数
- 寻找 最小的k个数 线性选择算法 平均时间复杂度 O(n)
- 从数组中选择第k大的数
- 算法--选择第K大的数
- TOP K 和快速选择SELECT
- 【算法导论】线性时间选择---从数组中选择第i小的数
- 游戏框架其九:灯光和材质( Lights and Material )
- AVL 另一种实现方法
- guhuiti
- 将n个整数前面的数据后移m位
- 使用SharePoint自带的Workflow(一) 开启workflow
- 快速选择(quick select) + 线性时间选择(linear-time select) - 求出n个数中第k大的数
- DML、DDL、DCL三者定义(数据库的操作)
- 接口与抽象类
- 并查集 PKU 1611
- KMP C++实现代码
- XSS防脚本注入的过滤器
- IOS开发------图片浏览器
- TreeSet存储自定义对象,并对对象排序的两种方式
- nats介绍