面试题66:数据流之中的中位数

这道题是用最大堆和最小堆来实现的问题。难度颇大。现在我先着重搞明白之中的代码是怎么回事。

//test 64 数据流中的中位数
template<typename T> class DynamicArray
{
public:
    void Insert(T 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<T>());//经过此操作,堆排序之后,直接把最大的元素送到堆顶!
                num = max[0];//找到最大堆之中最大的元素
                pop_heap(max.begin(), max.end(), less<T>());//std::pop_heap将front(即第一个最大元素)移动到end的前部,同时将剩下的元素重新构造成(堆排序)一个新的heap。
                max.pop_back();
            }
            min.push_back(num);
            push_heap(max.begin(), max.end(), less<T>());
        }
        else
        {
            if (min.size()>0 && num > min[0])
            {
                min.push_back(num);
                push_heap(min.begin(), min.end(), greater<T>());

                num = min[0];

                pop_heap(min.begin(), min.end(), greater<T>());

                min.pop_back();
            }
            max.push_back(num);
            push_heap(max.begin(), max.end(), less<T>());
        }
        
        T GetMedian()
        {
            int size = min.size() + max.size();
            if (size == 0)
                throw exception("No numbers are avaiable");

            T median = 0;
            if ((size0x01) == 1)
                median = min[0];
            else
                median = (min[0] + max[0]) / 2;

            return median;
        }
    }
private:
    vector<T> min;
    vector<T> max;
};
posted @ 2015-03-02 11:08  程序员小王  阅读(1083)  评论(0编辑  收藏  举报