#ifndef TG_DATA_STREAM_MEDIAN_H
#define TG_DATA_STREAM_MEDIAN_H
#include <algorithm>
#include <vector>
#include <functional>
#include<exception>
// 面试题41:数据流中的中位数
// 题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么
// 中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,
// 那么中位数就是所有数值排序之后中间两个数的平均值。
template<typename T>
class tg_data_stream_median
{
public:
void insert(T num)
{
if(((_min_heap.size() + _max_heap.size()) & 1) == 0)
{
if(_max_heap.size() > 0 && num < _max_heap[0])
{
_max_heap.push_back(num);
push_heap(_max_heap.begin(), _max_heap.end(), std::less<T>());
num = _max_heap[0];
pop_heap(_max_heap.begin(), _max_heap.end(), std::less<T>());
_max_heap.pop_back();
}
_min_heap.push_back(num);
push_heap(_min_heap.begin(), _min_heap.end(), std::greater<T>());
}
else
{
if(_min_heap.size() > 0 && _min_heap[0] < num)
{
_min_heap.push_back(num);
push_heap(_min_heap.begin(), _min_heap.end(), std::greater<T>());
num = _min_heap[0];
pop_heap(_min_heap.begin(), _min_heap.end(), std::greater<T>());
_min_heap.pop_back();
}
_max_heap.push_back(num);
push_heap(_max_heap.begin(), _max_heap.end(), std::less<T>());
}
}
T GetMedian()
{
int size = _min_heap.size() + _max_heap.size();
if(size == 0)
{
throw ("No numbers are available");
}
T median = 0;
if((size & 1) == 1)
median = _min_heap[0];
else
median = (_min_heap[0] + _max_heap[0]) / 2;
return median;
}
size_t size()
{
return _min_heap.size() + _max_heap.size();
}
private:
std::vector<T> _min_heap;
std::vector<T> _max_heap;
};
#endif // TG_DATA_STREAM_MEDIAN_H