どのように5億から数の中央値を見つけるには?

タイトル説明

500万人から数うち中央の図。データが並べ替えた後、数が中間位置にあることは、中央値です。サンプル数が奇数である場合、メジアン  (N+1)/2 数、サンプル数が偶数である場合、中央値  N/2 の数  1+N/2 平均数。

答えへのアイデア

この質問は、メモリサイズ制限ならば、あなたはすべての中央値を検索し、ソート・メモリ内の番号を読み取ることができません。しかし、ソートアルゴリズムのベストタイムの複雑さがあります  O(NlogN)他の方法を使用することをここに。

方法a:方法bioheap

これは、2つのスタック、ヒープビッグトップ、小さなヒープのトップを維持しています。大きなトップ未満又は小トップスタックの最小数に等しい数の最大値をスタックと、せいぜい2つのスタックを確実にする要素の数の差。

データの総数が偶数である場合に2つのスタックが完了したときに、中央値は、スタックの最上部に、これら二つの要素の平均です。データの総数が2つのスタック、スタックの特定のスタックの最上位のデータの中央値の大きさに応じて、奇数のとき。

クラスMedianFinder { 
    
    プライベート優先度つきキュー<整数> maxHeap。
    プライベート優先度つきキュー<整数> のminheap。

    / ** ここにあなたのデータ構造を初期化します。* / 
    パブリックMedianFinder(){ 
        maxHeap = 新しい優先度つきキュー<> (Comparator.reverseOrder())。
        minheap = 新しい優先度つきキュー<> 整数::のcompareTo)。
    } 
    
    公共 ボイド addNum(INT NUM){
         場合(maxHeap.isEmpty()|| maxHeap.peek()> NUM){ 
            maxHeap.offer(NUM)。
        }  {
            minHeap.offer(NUM)。
        } 
        
        INT SIZE1 = maxHeap.size()。
        INT size2に= minHeap.size()。
        もし(SIZE1 - size2に> 1 ){ 
            minHeap.offer(maxHeap.poll())。
        } そう であれば(size2に- SIZE1> 1 ){ 
            maxHeap.offer(minHeap.poll())。
        } 
    } 
    
    公共 ダブルfindMedian(){
         int型 SIZE1 = maxHeap.size()。
        INT size2に= minHeap.size()。
        
        リターン SIZE1 == size2に 
            (maxHeap.peek()+ minHeap.peek())* 1.0 / 2 
            :(SIZE1?> size2にmaxHeap.peek():minHeap.peek()); 
    } 
}

 

见LeetCode No.295:https://leetcode.com/problems/find-median-from-data-stream/

この上記の方法は、すべてのデータがメモリにロードする必要があります。大量のデータは、それが当てはまらない場合、したがって、この方法は、データ量が少ない場合にも適用可能です。5億数は、各番号は図4Bに示すように、メモリの2Gの合計を占めています。使用可能なメモリが2G未満である場合は、この方法を使用することはできませんし、別の方法を以下に説明しました。

方法2:分割統治

アイデアは、分割統治に徐々に解決するために小さな問題に変換する大きな問題です。

この質問のために、シーケンシャルは、それが最上位ビットに対応する場合、バイナリ1である、デジタルNUMを読み取るために、5億フィギュアこれを読んで、それ以外の書かれたF0で、F1を書かれた数字を入れました。この工程により、次の2つの部分に分け5億の数を置くことができ、かつ数f1の両方におけるF0の数は(最上位ビットが符号ビットである)よりも大きくなります。

分裂した後、あなたは簡単で、中央値F0またはF1を知ることができます。数のF1億を仮定し、それが中央値F0である必要があり、f0は1.5億の最大数とし、その背後にある小さな数の平均値、です。

プロンプトは500百万2.5億数の中央値は、数が平均右側に隣接しています。もしF1億数は、その後、中央値は150万ドルの平均を取得する最初の番号から始まる番号2 F0です。

F0は、その分割ファイルがメモリにロードすることができるようになるまでに分かれ、二つにバイナリファイルを続けるハイ回に使用することができ、データを直接注文後メモリにロードされ、中央値を見つけます。

ノートはデータの総数が偶数である場合、データファイルは二つに分割されている場合は、同じ番号を持っている、ということは、中央値の最小平均は、データファイル内のデータファイルの最大値が小さいほど大きいです。

メソッド

分治法,真香!

おすすめ

転載: www.cnblogs.com/qmillet/p/12562295.html