數據流中的中位數
本博客所有出現的 [不一樣的劍指offer] 系列,個人認爲都比書上的題解更好理解。
概括:書上的題目在實現兩個數據結構的平衡的地方寫的有點囉嗦。這裏分別有兩種方法實現,要簡單很多。
1 優先級隊列
class MedianFinder {
priority_queue<int> lo; // 大頂堆 左半邊 從大到小 大的先出
//priority_queue<int, vector<int>, less<int> > lo; //相當於這樣寫
priority_queue<int, vector<int>, greater<int>> hi; // 小頂堆
public:
// Adds a number into the data structure.
void addNum(int num) {
lo.push(num); // 加到大頂堆
hi.push(lo.top()); // 平衡
lo.pop();
if (lo.size() < hi.size()) { // 維護兩個堆元素個數
lo.push(hi.top());
hi.pop();
}
}
// Returns the median of current data stream
double findMedian() {
return lo.size() > hi.size() ? (double) lo.top() : (lo.top() + hi.top())*0.5;
}
};
2 multiset
class MedianFinder2 {
public:
/** initialize your data structure here. */
multiset<int, less<>> min_set;//最小值放前面 對應排序數組的右半邊
multiset<int, greater<>> max_set;//最大值放前面,對應排序數組的左半邊
MedianFinder2() {
}
void addNum(int num) {
max_set.insert(num);
min_set.insert(*max_set.begin());
max_set.erase(max_set.find(*max_set.begin()));
if(max_set.size()<min_set.size()){
max_set.insert(*min_set.begin());
min_set.erase(min_set.find(*min_set.begin()));
}
}
double findMedian() {
return max_set.size()>min_set.size()?*max_set.begin(): (double(*min_set.begin())+double(*max_set.begin()))/2;
}
};
個人見解,歡迎討論指教!