数据流中的中位数

若采用stl的sort函数对vector进行排序,时间复杂度为0(n^2),改为采用堆排序,时间复杂度为O(log(n)*n)。通过最大堆和最小堆实现,求取中位数,保证两个堆的数目之差不超过1,同时最大堆的数据小于最小堆的数据。当数据总数目是偶数时,插入最小堆(若数,小于最大堆最大数,则先插入最大堆,排序最大堆,将最大堆的最大数插入最小堆中去),反之亦然。

代码:

class Solution {
public:
    void Insert(int num)
    {
        if(((min.size()+max.size())&1)==0){
            if(max.size()>0&&num<max[0]){
                max.push_back(num);
                push_heap(max.begin(),max.end(),less<int>());
                num = max[0];
                pop_heap(max.begin(),max.end(),less<int>());
                max.pop_back();
            }
            min.push_back(num);
            push_heap(min.begin(),min.end(),greater<int>());
        }
        else{
            if(min.size()>0&&num>min[0]){
                min.push_back(num);
                push_heap(min.begin(),min.end(),greater<int>());
                num = min[0];
                pop_heap(min.begin(),min.end(),greater<int>());
                min.pop_back();
            }
            max.push_back(num);
            push_heap(max.begin(),max.end(),less<int>());
        }
    }


    double GetMedian()
    { 
        int size = min.size()+max.size();
        if((size&1)==1)
            return min[0]*1.0;
        else
            return (min[0]+max[0])/2.0;
    }
private:
    vector<int> min;
    vector<int> max;
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值