zoukankan      html  css  js  c++  java
  • 面试题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;
    };
  • 相关阅读:
    codevs1288 埃及分数
    codevs1792 分解质因数
    dp
    JAVA大数贪心
    求最长不重叠子串
    初识后缀数组
    dp
    两数相除,判断小数位是否有限位
    构造二分图匹配
    建立多个树状数组
  • 原文地址:https://www.cnblogs.com/chengxuyuanxiaowang/p/4308260.html
Copyright © 2011-2022 走看看