295中央データ・ストリーム
中央値は、順序付けられたリストの真ん中の数です。リストの長さが偶数の場合、中央値は、2つの中間の数値の平均値です。
たとえば、
[2,3,4]メジアン3
[2,3]中央値は(2 + 3)/ 2 = 2.5
以下の2つの操作をサポートするように設計されたデータ構造:
ボイドaddNum(int型NUM) -整数のデータストリームからのデータ構造を追加します。
ダブルfindMedian() -すべての要素の現在の中央値を返します。
例:
addNum(1)
addNum(2)
findMedian() - > 1.5
addNum(3)
findMedian() - > 2
进阶。
データ・ストリームは、0〜100の範囲内のすべての整数であれば、どのようにあなたのアルゴリズムを最適化するのでしょうか?
整数データをストリーミングした場合、99%はあなたのアルゴリズムを最適化する方法を、0〜100の範囲内にありますか?
思考
最近の研究Goでは、C ++長い時間が書いていません。
しかし、C ++ヒープの右上部にある小さなヒープのビッグトップでSTLが、私の問題は、ちょうどそう怠惰を盗んだ、ライン上でポップ、プッシュする必要があります。
書式#include <キュー>通常のプログラミングを覚えておいてください。
私のコード
class MedianFinder {
public:
MedianFinder() {
}
void addNum(int num) {
if (V.size()==0) {
V.push(num);
return;
}
if (V.size() == A.size()) {
if (num >= A.top())
V.push(num);
else {
V.push(A.top());
A.pop();
A.push(num);
}
}
else
if (num >= V.top()) {
V.push(num);
A.push(V.top());
V.pop();
}
else
A.push(num);
}
double findMedian() {
if (V.size() == A.size()) {
return (A.top() + V.top()) / 2.0;
}
else
return V.top();
}
priority_queue<int> A;
priority_queue<int, vector<int>, greater<int> > V;
};