求一个数据流的中位数

来源:互联网 发布:js设置input失去焦点 编辑:程序博客网 时间:2024/05/16 15:50

本题源自剑指offer

----------------------------------------------------------------------

用两个堆来解决这个问题 1用最大堆存储左半部分的数,用最小堆存储有半部分的数据,若有奇位个数,中位数就是最小堆的堆顶,否则为最大堆和最小堆堆顶的平均数。

如果当前数据流中的数为偶数个,则新数据插入最小堆,否则插入最大堆。保证最小堆中的数比最大堆的数大。

    void Insert(int num)    {        //总数目为偶数时,插入最小堆,否则插入最大堆,最大堆的数字都比最小堆的小        if(((max.size()+min.size())&1)==0){            if(max.size()>0&&max[0]>num){                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==0)            return -1.0;        if(size&1){            return min[0];        }        return (double)(min[0]+max[0])/2;    }


原创粉丝点击