标签:
题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数据排序后中间两个数的平均值。template<typename T> class Heap { private: vector<T> min; vector<T> max; public: void Insert(T num) { if(((min.size()+max.size())&1)==0)//偶数插入左边最大堆; { if(max.size()>0 && num<max[0]) { max.push_back(num); push_heap(max.begin(),max.end(),less<T>()); num=max[0]; pop_heap(max.begin(),max.end(),less<T>()); max.pop_back(); } min.push_back(num); push_heap(min.begin(),min.end(),greater<T>()); } else //奇数插入右边最小堆; { if(min.size()>0&&num>min[0]) { min.push_back(num); push_heap(min.begin(),min.end(),greater<T>()); num=min[0]; pop_heap(min.begin(),min.end(),greater<T>()); min.pop_back(); } max.push_back(num); push_heap(max.begin(),max.end(),less<T>()); } } T get_median() { int size=min.size()+max.size(); if(size==0) throw exception("no numbers are available"); T median=0; if((size&1)!=0) //如果是奇数返回最小堆的第一个元素; { median=min[0]; } else //如果是偶数则返回中间两个数的平均值; { median=(max[0]+min[0])/2; } return median; } };
标签:
原文地址:http://blog.csdn.net/gogokongyin/article/details/51788119