算法题48:数据流中的中位数
思路
计算中位数,只需要有序数组中间位置的一位或两位数值,利用一个大根堆保存前半部分数据,一个小根堆保存后半部分数据,每插入一个数值,都要重新分配一下两个堆的数量,始终保持大根堆的数量比小根堆多一个或者二者数量一样多。
代码
priority_queue<int, vector<int>> max_q; //大根堆保存前半部分数据
priority_queue<int, vector<int>, greater<int>> min_q; //小根堆保存后半部分数据
void Insert(int num) {
max_q.push(num);
//确定新插入元素的位置
min_q.push(max_q.top());
max_q.pop();
//划分数据
//保持前半部分比后半部分的数据多一个或一样多
if(min_q.size() > max_q.size()){
//从小根堆中弹出最小的值加入前半部分
max_q.push(min_q.top());
min_q.pop();
}
}
double GetMedian() {
//若为奇数个,直接取出大根堆的堆顶元素
//若为偶数个,则分别取出大根堆和小根堆的堆顶元素进行计算
if(max_q.size() > min_q.size()) return max_q.top();
else return (double(max_q.top() + min_q.top()))/2;
}