数据流中的中位数

思路:要保证数据容器左边的数据都小于右边的数据,用一个最大堆实现左边的数据容器,用一个最小堆实现右边的数据容器。

首先要保证数据平均分配到两个堆中,因此两个堆中数据的数目之差不能超过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() && 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()
    { 
        double mid=0;
        if(((min.size()+max.size()) & 1)==1)
            mid=min[0];
        else
            mid=(min[0]+max[0])/2.;
        return mid;
            
    
    }
private:
    vector<int> min;//小顶堆
    vector<int> max;//大顶堆
    

};

  

posted @ 2019-05-18 10:17  LJ的博客  阅读(195)  评论(0编辑  收藏  举报