您的位置:首页 > 其它

[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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: