数据流的中位数

题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。

这道题“剑指offer”上给出的思路有:
排序;
二叉搜索树;(记录节点的子节点数)
平衡二叉搜索树;(以节点的子节点数为平衡因子)
大、小堆(左边为最大堆,右边为最小堆,左边的数比右边的数小;左边数的总数目等于右边(中位数为堆顶平均数)或者比右边大1(中位数为左边堆顶数);)

参考代码(来自牛客网)

class Solution {
public:
    priority_queue<int ,vector<int>,less<int> >p;
    priority_queue<int ,vector<int>,greater<int> >q;
    void Insert(int num)
    {
        if (p.empty() || num < p.top())
        {
            p.push(num);
        }
        else q.push(num);
        if (p.size()==q.size()+2)
        {
            q.push(p.top());
            p.pop();
        }
        if (p.size()+1==q.size())
        {
            p.push(q.top());
            q.pop();
        }
        
    }

    double GetMedian()
    { 
        return p.size()==q.size()?(p.top()+q.top())/2.0:p.top();
    }

};

猜你喜欢

转载自blog.csdn.net/xnmc2014/article/details/87517928