剑指Offer: 数据流中的中位数;C++容器适配器之priority_queue

数据流中的中位数


如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。


维护一个最大堆,一个最小堆,两个堆大小差值小于等于1。
在这里使用的优先队列。


class Solution {
public:
    void Insert(int num)
    {
        if(big.empty()||num<=big.top()) big.push(num);
        else    small.push(num);
        while(big.size()>small.size()+1){
            small.push(big.top());
            big.pop();
        }
        while(small.size()>big.size()+1){
            big.push(small.top());
            small.pop();
        }
    }
    double GetMedian()
    { 
        if(big.size()==small.size()){
            return (big.top()+small.top())/(double)2;
        }
        else if(big.size()<small.size()){
            return small.top();
        }
        else{
            return big.top();
        }
    }
private:
    priority_queue<int> big;//最大堆
    priority_queue<int,vector<int>,greater<vector<int>::value_type>> small;//最小堆
};

C++容器适配器之priority_queue


Reference:
http://www.cnblogs.com/mfryf/archive/2012/09/05/2671883.html


一、使用:priority_queue

priority_queue<int> qb;//默认最大堆
priority_queue<int,vector<int>,greater<vector<int>::value_type>> qs;//最小堆

二、接口(对于队列):

1、pop()
2、top():只适用于priority_queue。
3、emplace()
4、push() size()
而:
front() back()只适用于queue。


注释掉的是不支持的。


#include <iostream>
#include <queue>
using namespace std;

int main()
{
    priority_queue<int,vector<int>,greater<vector<int>::value_type>> q;//small
    q.push(7);
    q.push(2);
    q.push(10);
    q.push(4);
    q.push(5);
    cout<<"head\t"<<q.top()<<endl;
//    cout<<"tail\t"<<q.back()<<endl;
    cout<<"size\t"<<q.size()<<endl;
    q.pop();//auto h=并没有返回值
    cout<<"head\t"<<q.top()<<endl;
 //   cout<<"now head\t"<<q.front()<<endl;
    q.emplace(6);//调用构造函数
    cout<<"head\t"<<q.top()<<endl;
 //   cout<<"now tail\t"<<q.back()<<endl;
    cout << "Hello world!\t\t\t@zem" << endl;
    return 0;
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值