タイトル説明
データ・ストリームの中央値を取得する方法?数値が奇数データストリームから読み込まれた場合、中央値は、ソート後のすべての値の中央に位置しています。偶数値は、データストリームから読み出された場合、中央値は、注文の全ての中間値の後に2つの数の平均値です。私たちは、データが読み込まれ、現在の中央値を取得するためにGetMedian()メソッドを使用して、データ・ストリームを読み取るために挿入()メソッドを使用します。
問題解決のためのアイデア
- 最初のセットトップ優先度つきキュースタックとヒープビッグトップの小さなセットを持つJava
- 主なアイデアは:中央値が必要とされているので、2つの反応器、ヒープの大きい上部は降順で、小さな数を維持するために使用されます。
- トップ*ソート大量注文に小さなから、小さな多数の備蓄、明らかに中央値は、ルートとヒープと平均のヒープ小さなトップビッグトップのルートです。
- ⭐確保:小さなトップスタック要素は、以上に大きなトップスタック内の要素は、各プラグの値は、直接に入らないが、むしろ、別のスタックのポーリングからプラグの最大値(最小値)であります
- ⭐偶数回は、この値はスタックの大きい上部に挿入され、次いで大ヒープルート上(すなわち最大値)は小さいスタックの先頭に挿入されます。
- 数が奇数である場合、この値が小さいスタックの最上部に挿入されたとき⭐、スタックトップ反復小さなルートノード(すなわち、最小)が大きいパイル頂部に挿入されます。
- 現在の数が偶数である場合、トップスタックは明らかに小さく、大きな平均トップスタックのルートノードを取る取ら⭐メジアン時間、現在の数が奇数の場合、明らかに小さなトップスタックルートを取ります
Iは、上記の主要なアイデアは、次の例では、補助をテストすることを理解しました。
例えば、着信データがある:[5,2,3,4,1,6,7,0,8]、その後必要に応じて、出力は "5.00 3.50 3.00 3.50 3.00 3.50 4.00 3.50 4.00" であります
次いで、全体のプロセスの実行フローがなければならない(小さなパイル上部分で表される、maxは大きなスタックトップを示します)。
- 5 [5]は、MAX = [NO] =この時間分、小さなパイル頂部に、大きなスタックの最上位に入らない大きな最大スタックの、トップに、平均= [5.00]
- 図2は、小さなパイルトップ、スタックの上部と大きなパイル頂部に小さな最小値、この時間分= [5]は、MAX = [2]、平均= [(5 + 2)/ 2] = [3.50を入力します]
- 3大ヒープの最上部に入り、その後、小さなパイル頂部に大きな最大スタックトップ、この時間分= [3,5]、最大= [2]、平均= [3.00]
- 図4は、小さなパイルトップ、スタック及び大パイル頂部に小さな最小値の上面、この時間分= [4,5]、最大= [3,2]、平均= [(4 + 3)/ 2を入力します] = [3.50]
- 最初の大スタックトップ、小さなパイル頂部に大きな最大スタックの、トップ、この時に1分= [3,4,5]と、MAX = [2,1]、平均= [3/00]
- 図6は、小さなパイルトップ、スタック及び大パイル頂部に小さな最小値の上面、この時間分= [4,5,6]を、入力する最大= [3,2,1]、平均= [(4+ 3)/ 2] = [3.50]
- 図7は、この時間分= [4,5,6,7]、最大= [3,2,1]、平均= 4で、ヒープスタックにスタック最大の、大大小ルーフトップのトップを入力します] = [4.00]
- 0小さなパイルトップ、スタックの上部と小さな山の頂に小さな最大値、この時間を入力する分= [4,5,6,7]、最大= [3,2,1,0]、平均= [(4 + 3)/ 2] = [3.50]
- 8、大きなパイル頂部に次いで大きな最小トップパイル、この時間分= [4,5,6,7,8]、最大= [3,2,1,0]を、大きなヒープの最上部を入力します平均= [4.00]
コードは以下の通りです
@ スモールスタックトップ
プライベート優先度つきキュー<整数> =のminheap 新しい新しい優先度つきキュー<整数> ();
// 大スタックトップ
プライベート優先度つきキュー<整数> = maxheap 新しい新しい優先度つきキュー<整数>(15、新しい新しいコンパレータ<整数> (){
@Override
公共 INT 比較(O1整数、整数O2){
返す - O2 、O1を
}
});
// 偶数又は奇数記録
INTの COUNT = 0 ;
// スタックのトップが小さい大電流の最大スタックトップに挿入されるたびに数
//各スタックは、小さな電流最小トップスタックの多数の上部に挿入されている
@ これは、スタックの最上部の少数のトップスタックの多数に常に以上であることを確実にする
// 中央値は、好都合に、両方のルートから調製することができます。ポイント取得
公共 ボイドをインサート(整数NUM){
// 小さい挿入最大スタックトップのスタックの大きい第一、次いで頂部に偶数、スタックの、トップを多数
IF(COUNT%2 == 0 ){
maxHeap.offer(NUM);
int型の最大値= maxHeap.poll();
minHeap.offer(MAX);
} 他{
// 奇数は、次いで、第一のスタックの上部が小さなスタックの小さい、次いで上部に挿入されています最小のスタックの最上位の多数に挿入
; minHeap.offer(NUM)
INT分= minHeap.poll()。
maxHeap.offer(分);
}
COUNT ++ ;
}
公共ダブルGetMedian(){
// これが偶数である場合、小さなルーフスタックの上部とヒープを取る大きな上部スタック素子を平均
IF(COUNT%2 == 0 ){
戻り 新しい新しいダブル(のminheapを。 PEEK()+ maxHeap.peek())/ 2 ;
} 他{
// これは奇数、小さな要素から直接取得スタックの最上位である
リターンは 新しい新しいダブル(minHeap.peek());
}
}