295データは、中央値Cをストリーム++

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;
};
公開された38元の記事 ウォンの賞賛0 ビュー1039

おすすめ

転載: blog.csdn.net/Cyan1956/article/details/104643945