[LintCode] Median(期望时间复杂度O(n)求中位数和第k大数)
2015-07-28 20:01
369 查看
class Solution { public: /** * @param nums: A list of integers. * @return: An integer denotes the middle number of the array. */ void swap(vector<int> &v, int i, int j) { int tmp = v[i]; v[i] = v[j]; v[j] = tmp; } int getMinK(vector<int> &v, int left, int right, int k) { if(left<right) { int i = left-1, j = left; for(; j<right; ++j) { if(v[j]<v[right]) { ++i; swap(v, i, j); } } swap(v, i+1, right); if(k==i+1) return v[i+1]; else if(k<=i) return getMinK(v, left, i, k); else return getMinK(v, i+2, right, k); } else return v[left]; } int median(vector<int> &v) { // write your code here return getMinK(v, 0, v.size()-1, (v.size()-1)/2); } };
主要利用快排递归划分的思想,可以在期望复杂度为O(n)的条件下求第k大数。快排的期望复杂度为O(nlogn),因为快排会递归处理划分的两边,而求第k大数则只需要处理划分的一边,其期望复杂度将是O(n)。详细的证明见《算法导论》。
我们可以这样粗略的思考:
假设我们的数据足够的随机,每次划分都在数据序列的中间位置,那么第一次划分我们需要遍历约n个数,第二次需要遍历约n/2个数,...,这样递归下去,最后:n+n/2+n/(2^2)+n/(2^3)+...+n/(2^k)+... = (1+1/2+1/(2^2)+1/(2^3)+...+1/(2^k)+...)*n, 当k趋于无穷大的时候,上式的极限为2n。
相关文章推荐
- iOS 对于文件的解析 JSON DOM SAX
- CentOS 6.6 yum 安装 nginx
- hdu 5325 Crazy Bobo 乱搞+搜索
- 内部类的四种形式
- hdu 5317 RGCDQ 多校 思维题
- poj 3723 最大权森林 最小生成树的运用
- HTML CSS简单总结
- HDU 2844 Coins 方案总数
- native层获取Android设备电池电量
- 【基础练习】【棋盘DP】codevs2193 数字三角形ww题解
- 3D打印机切片引擎Cura分析<一>
- centos6.5安装apache2.x并更改默认80port
- Scala 深入浅出实战经典 第43讲:主要介绍类型变量bound
- MyBatis知多少(21)更新操作
- HDU 5319 Painter
- HTTP学习要点(二)
- oracle常见问题:delete truncate drop的区别
- 【HDOJ 1068】Girls and Boys
- 嘿。。。
- 【BZOJ 1148】【CTSC 2008】挂缀【BZOJ 1 148】【CTSC 2008】挂缀