安全性データ・ストリームを証明するために、中央値[プラン]

タイトル説明

データ・ストリームの中央値を取得する方法?数値が奇数データストリームから読み込まれた場合、中央値は、ソート後のすべての値の中央に位置しています。偶数値は、データストリームから読み出された場合、中央値は、注文の全ての中間値の後に2つの数の平均値です。私たちは、データが読み込まれ、現在の中央値を取得するためにGetMedian()メソッドを使用して、データ・ストリームを読み取るために挿入()メソッドを使用します。

分析:ビッグヒープルートルート小さなヒープ方法

今、私たちは小さなヒープルートに、大きなルートヒープに配列の後半を配列の最初の半分を入れた場合、中央値は唯一、ヒープのトップも、大規模ルート要素ルート小さなヒープを積み重ねだろう、秩序ある配列を想定スタック要素の上面、またはスタック平均の上部の両方の要素

私たちは、特定のルールに従うとき、あなたはこの効果を達成することができます挿入しました

二つの要素のスタックの異なる数の挿入は、新しい要素は、ヒープ少数の中に挿入されます

もし同じ要素数、スタックのランダム挿入

大ルート要素は、スタックの最上部よりも大きい場合、スタック細根は、スタック要素、スタックの最上位であるスイッチング素子の上部スタック

挿入が完了した後、中央値、要素の数に応じて決定されます

時間計算:(1)Oの数を挿入する(N * Nログ)、中央値Oを得ます

クラスのソリューション
{ 
パブリック

    PRIORITY_QUEUE < int型、ベクトル< int型 >、あまり< int型 >> Q1を;     // 大根スタック 
    PRIORITY_QUEUE < int型、ベクトル< int型 >、グレーター< int型 >> Q2を; // 細根はスタック

    // 挿入数
    無効(挿入int型UM)を
    { 
        INT X = UM; 

        // 挿入ルール
        IF(q1.size()== q2.size())
        { 
            q2.push(X); 
        } 
        そう IF(q2.size()>q1.size())
        { 
            q1.push(X); 
        } 
        そう IF(q1.size()> q2.size())
        { 
            q2.push(X); 
        } 

        // 大ルートヒープパイル上部要素細根、上部スタック素子交換関係するかどうかを決定
         // データが正しいスタックであることを確認
         // (前半に格納されている、すなわち、大根順序付けられたスタックアレイ要素、根パイル要素ストレージの順序付けられた配列の後半)
        場合(Q1を!.size()= 0 && q2.size()!= 0 
        { 
            IF(q1.top()> q2.top())
            { 
                int型 A = q1.top();
                 int型 B = q2.top()。
                q1.pop();
                q2.pop();
                q1.push(B); 
                q2.push(A); 
            } 
        } 
    } 
    ダブルGetMedian()
    { 
        ダブルX; 

        // 中央値を見つけるために元素の分布とパリティ素子の数
        IF(q1.size()== q2.size())
        { 
            X =(q1.top()* 1.0 + q2.top()* 1.0)/ 2.0 ; 
        } 
        そう IF(q2.size()> q1.size())
        { 
            X = Q2。トップ()* 1.0 ; 
        } 
        他の IF(q1.size()>q2.size())
        { 
            X = q1.top()* 1.0 
        } 
        戻りX; 
    } 
}。

おすすめ

転載: www.cnblogs.com/yinbiao/p/11596780.html