数据流中的中位数
思路:要保证数据容器左边的数据都小于右边的数据,用一个最大堆实现左边的数据容器,用一个最小堆实现右边的数据容器。
首先要保证数据平均分配到两个堆中,因此两个堆中数据的数目之差不能超过1,为了实现平均分配,可以在数据的总数目是偶数时把新数据插入最小堆,否则插入最大堆,还要保证最大堆中的所有数据都要小于最小堆中的数据。
class Solution { public: void Insert(int 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<int>()); num=max[0]; pop_heap(max.begin(),max.end(),less<int>()); max.pop_back(); } min.push_back(num); push_heap(min.begin(),min.end(),greater<int>()); } //数据的总数目是奇数时,把数据插入大顶堆 else { //若插入的数据比小顶堆堆顶大,则应先插入小顶堆,取出小顶堆的堆顶插入大顶堆 //因为必须保证大顶堆的数都小于小顶堆的数 if(min.size() && num>min[0]) { min.push_back(num); push_heap(min.begin(),min.end(),greater<int>()); num=min[0]; pop_heap(min.begin(),min.end(),greater<int>()); min.pop_back(); } max.push_back(num); push_heap(max.begin(),max.end(),less<int>()); } } double GetMedian() { double mid=0; if(((min.size()+max.size()) & 1)==1) mid=min[0]; else mid=(min[0]+max[0])/2.; return mid; } private: vector<int> min;//小顶堆 vector<int> max;//大顶堆 };