タイトル説明
データ・ストリームの中央値を取得する方法?数値が奇数データストリームから読み込まれた場合、中央値は、ソート後のすべての値の中央に位置しています。偶数値は、データストリームから読み出された場合、中央値は、注文の全ての中間値の後に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; } }。