トピック:
どのようにデータ・ストリームの中央値を取得するには?数値が奇数データストリームから読み込まれた場合、中央値は、ソート後のすべての値の中央に位置しています。偶数値は、データストリームから読み出された場合、中央値は、注文の全ての中間値の後に2つの数の平均値です。私たちは、読み込まれ、現在の中央値のデータを取得するためにGetMedian()メソッドを使用して、データ・ストリームを読み取るために挿入()メソッドを使用します。
アイデア:
:中央値の参照は、データストリームリンクすることができhttps://www.jianshu.com/p/f7e2ed52052dを
1つの#include <iostreamの> 2の#include <ベクトル> 3。の#include <キュー> 4。 5。 使用した 名前空間STD; 6。 7。 // メジアンデータストリーム 8。 クラスソリューション{ 9。 プライベート: 10 のint COUNT = 0 ; 11 PRIORITY_QUEUE < INT、ベクトル< INT >> max_heap; // 最大スタック 12である PRIORITY_QUEUE < INT、ベクトル< INT >、大< INT >> min_heap; // 最小ヒープ 13 14 公衆: 15 ボイド挿入(int型NUM) 16 { 17。 COUNT ++ ; 18は、 // 偶数-挿入最小ヒープ>; 19。 IF((&COUNT 1)== 0){ // 偶数も効率書き込み決意 20は min_heap .push(NUM); 21で IF(!max_heap.empty()&& max_heap.top()> NUM) // 新しい要素は、スタックが小さい最大よりもスタックの最上部に挿入する場合は 22であり 、{ 23である (min_heap.pop); 24 25 int型 TEMP = max_heap.top(); 26であります max_heap.pop(); 27 min_heap.push(TEMP); // スタックの最大スタックトップは最小ヒープに挿入される 28 29 max_heap.push(NUM); // 新しい要素最大スタックに 30 } 31 } 32 // 奇数- >最大ヒープ挿入; 33である 他{ 34で max_heap.push(NUM); 35 IF(min_heap.empty()&& min_heap.top()<NUM!){ // 新しい要素は最小スタックよりもスタックの先頭に挿入される場合より大きな 36 max_heap.pop(); 37 38である INT TEMP = min_heap.top(); 39 min_heap.pop(); 40 max_heap.push(TEMP); // スタックの最小、最大スタックトップ、スタックに挿入される 41は 42である min_heap.push(NUM); // 最小ヒープに新しい要素 43 } 44 } 45 // 方法上記数が偶数の場合の中央値が最小とスタック内のスタックの最大スタックトップ維持することができ、平均値は、二つの山の頂部があった場合に最大のトップ杭と比較奇数; 46である } 47 48 ダブルGetMedian() 49 { 50 ダブルRESは、 51であり、 IF((&COUNT 1)== 0){ // 偶数 52は RES =((ダブル)max_heap.top()+(ダブル)min_heap.top())/ 2 。 53 } 54 他{ 55の RES = max_heap.top()。 56 } 57の 58 戻りRES。 59 } 60 61 }。 62 63 のint main()の 64 { 65 ソリューションゾル。 66 ベクター< INT > NUMS = { 5、2、3、4、1、6、7、0、8、5 }。 67 のために(INT iは= 0 ; I <nums.size(); iは++ ){ 68 sol.Insert(NUMS [I])。 69 } 70 COUT << sol.GetMedian()<< ENDL。 71 }