随时找到数据流的中位数
【题目】
有一个源源不断地吐出整数的数据流, 假设你有足够的空间来
保存吐出的数。 请设计一个名叫MedianHolder的结构,
MedianHolder可以随时取得之前吐出所有数的中位数。
【要求】
1. 如果MedianHolder已经保存了吐出的N个数, 那么任意时刻
将一个新数加入到MedianHolder的过程, 其时间复杂度是
O(logN)。
2. 取得已经吐出的N个数整体的中位数的过程, 时间复杂度为
O(1)。
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<time.h>
#include<queue>
#include<algorithm>
#include<functional>
using namespace std;
int median(int num, priority_queue<int, vector<int>, greater<int>> &small,priority_queue<int> &big)
{
if (big.size()==0)
{
big.push(num);
}
else if(num <= big.top())
{
if ((int)big.size() - (int)small.size() == 1)
{
small.push(big.top());
big.pop();
big.push(num);
}
else//这个时候不需要担心小顶堆比大顶堆打,因为只有在大顶堆比小顶堆大2的时候才会往小顶堆
//里加
{
big.push(num);
}
}
else
{
if ((int)small.size() - (int)big.size() == 0)//保证输入流为奇数时,大顶堆的堆顶为中
//位数
{
big.push(small.top());
small.pop();
small.push(num);
}
else
small.push(num);
}
return big.size()>small.size()?big.top():(big.top()+small.top())/2;
}
int main()
{
int temp;
int i = 0;
int res;
priority_queue<int, vector<int>, greater<int>> small;//小顶堆里放中位数之后的数
priority_queue<int> big;//大顶堆里放中位数之前的数,这样可以通过与堆顶元素相比来决定放入哪
//个堆。同时堆顶元素也是中位数或者是我们需要的数。
while (i<5)
{
cin >> temp;
res = median(temp,small,big);
i++;
}
cout << res;
}