中央値のデータ・ストリームOJ_4_

トピック:
どのようにデータ・ストリームの中央値を取得するには?数値が奇数データストリームから読み込まれた場合、中央値は、ソート後のすべての値の中央に位置しています。偶数値は、データストリームから読み出された場合、中央値は、注文の全ての中間値の後に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 = { 5234167085 }。
67      のためにINT iは= 0 ; I <nums.size(); iは++ ){
 68          sol.Insert(NUMS [I])。
69      }
 70      COUT << sol.GetMedian()<< ENDL。
71 }

 

おすすめ

転載: www.cnblogs.com/grooovvve/p/12367724.html