ビットマップビットマップ原則と

プライマー

ビットマップが何であるかを理解することは質問にて初。

トピック:私は新しい整数を与えるために、40億個の整数を持って、私は40億整数新しい整数、あなたはどのように行うかどうかを決定する必要がありますか?

分析:

4000万整数は約16ギガバイトに相当する160億バイトであり、INT 4バイト(32ビット)を仮定し、2ギガバイトは、唯一のコンピュータメモリ、16ギガバイト仕上げローディングは、ローディング・ポイントを必要とすると仮定する8 、データを操作ioのディスクをディスクからロードされる(メモリ動作よりも100倍遅くなるように)非常に遅く、その都度そのような大規模なデータのロード、及び8倍に、時間は分またはクラスのも時間まで検索します。

もう一つの方法は、検索し、集計結果を同時に新しい、8台のコンピュータに8台のコンピュータやデータに散らばったデータを置くことです。このように、各コンピュータがデータをロードするオーバーヘッドをなくす、負荷データに前後に見ていない、メモリに1回のデータすることができ、それは良い方法です。

しかし、それを行うには、他のより良い方法はありますか?それはビットマップです。格納された値のビットマップのアイデア:各32ビットのint、int型整数範囲-2147483648 2147483647にあります。理解を簡単にするために、各整数共に正の整数であると仮定し、32分の2147483647 = 67108863、67108863を(負の整数が存在する場合には別途必要)、すなわちint型は、数値範囲[0,2147483647]を表すことができる唯一の整数、メモリの必要67108863 * 4 = 268435452のバイトは、コンピュータ完全に十分であっても負の整数部分はまた、0.4ギガバイトにのみメモリを要求されると、0.2ギガバイトに相当します。これは、[0,2147483647]に代わって67108863int配列、順番に各代表の配列を開きます。そして、新たな整数と必要性のみO(1)時間の複雑さ、非常に高い性能を決定します。

ビットマップの定義

各ビットマップは、各データのデータビットが0の配列データ、存在を示すデータが存在しないことを示して表しています。

例えば、この数136店舗、:

  1. セクション136は、判断32分の136の全データ= 4、すなわち、第4のセクションにおいて、
  2. 136いくつかの最初にこの間隔(ビット)、136%に決定32 = 25、すなわち、第4のセクション内の位置25;
  3. この位置は、この数の存在を示す、1に設定されます。

ビットマップデータので、自然の昇順に、保存されています。

コードの実装

#include <iostreamの> 
する#include <ベクトル> 使用して名前空間STDを、クラスビットマップ{
 パブリック
    ビットマップ(){ 
        bitVec_.resize((INT_MAX >> 5)+ 1);   // なぜなら配列のみ示すと、より多くのスペースを開きます区間[0、サイズ)    }
     ボイド BitmapSet(INT ヴァル){
         int型のインデックス=ヴァル>> 5。 ;   // 32を分割に等しい、シフト操作は、パフォーマンス向上させることができINT =%ヴァルオフセット32 ; 
        bitVec_ [インデックス] | = (1 << オフセット);
         INT

 



        容量= bitVec_.capacity()。
    } 
    BOOL BitmapGet(INT ヴァル){
         int型のインデックス=ヴァル>> 5 intは =オフセットヴァル%32 リターン bitVec_ [インデックス] - (1 << オフセット)。
    } 
プライベート
    ベクトル <符号なし整数 > bitVec_。
}。

int型(){主
    ビットマップBM。
    // 这里只存[0,1000000]的数、
    のためにINT iが= 0 ; I <= 1000000 ; ++I){ 
        bm.BitmapSet(I); 
    } 
    BOOL exist1 = bm.BitmapGet(100);        // 100がある場合、trueに戻る
    BOOL exist2 bm.BitmapGet =(10000000);   // 10000000が偽に戻る存在する

    (システムPAUSE " );
     戻り 0 ; 
}

 

 

おすすめ

転載: www.cnblogs.com/evenleee/p/12000529.html