数据流中的中位数

1、题目

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

2、解题1

时间复杂度O(n),数据流插入的时候保证有序

class Solution {
public:
    vector<int> stream;
    void Insert(int num)
    {
        if(stream.size()==0){
            stream.push_back(num);
            return;
        }
        int len = stream.size();
        for(int i = 0;i<len;i++){
            if(stream[i]>num){
                stream.insert(stream.begin()+i,num);
                return;
            }
        }
        stream.push_back(num);
    }

    double GetMedian()
    { 
        int len = stream.size();
        double result;
        if(len%2==0){
            result = (stream[len/2-1]*1.0+stream[len/2]*1.0)/2;
        }else{
            result = stream[len/2]*1.0;
        }
        return result;
    }

};

3、解题2

时间复杂度O(log2n),思路:中位数左边的最大值,右边的最小值

class Solution {
public:
    //降序队列,大顶堆
    priority_queue <int,vector<int>,less<int> >maxHeap;
    //升序队列,小顶堆
    priority_queue <int,vector<int>,greater<int> >minHeap;
    void Insert(int num)
    {
        //num放入堆中
        if(maxHeap.empty() || num<maxHeap.top()){
            maxHeap.push(num);
        }else{
            minHeap.push(num);
        }
        //两个堆数量相等,或者大堆数量=小堆数量+1
        if(maxHeap.size() == minHeap.size() + 2){
            minHeap.push(maxHeap.top());
            maxHeap.pop();
        }
        if(maxHeap.size() + 1 == minHeap.size()){
            maxHeap.push(minHeap.top());
            minHeap.pop();
        }
    }

    double GetMedian()
    {
        if(maxHeap.size() == 0)return 0;
        double result = 0;
        if(maxHeap.size() == minHeap.size()){
            result = (maxHeap.top()+minHeap.top())*1.0/2;
        }else{
            result = maxHeap.top()*1.0;
        }
        return result;
    }

};

(1)普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。

(2)在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。

//升序队列,小顶堆
priority_queue <int,vector<int>,greater<int> > q;
//降序队列,大顶堆
priority_queue <int,vector<int>,less<int> >q;

//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)

https://www.cnblogs.com/huashanqingzhu/p/11040390.html

©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:上身试试 返回首页