ビットマップ
3149 ワード
1.ビットマップとは?
『プログラミング珠玉』から来ました.Bit-mapとは、ある要素に対応するValueをビットでマークするもので、Keyはその要素です.Bitを単位としてデータを格納するため、記憶空間においても大幅に節約できる.
例えば、int型の空間を申請すると、4 Bytte、32 bitがあります.入力1,2,3,4 0000 0000 0000,000入力1,000 000,000 000,000,000,000入力2,000,000入力2 0000,000入力3 0000,0000入力3,000 0000 0000,0110入力4,000 0000入力4 0000,000入力4,000 0000入力0000,010入力4,000,000入力0000
2.mapマップテーブル
並べ替えまたは検索が必要な範囲が0~1000であれば、申請するメモリ空間はint a[N/32+1].そのうちa[0]はメモリに32桁を占め、これに類推する.bitmapはa[0]0~31 a[1]32~63 a[2]64~95 a[3]96~127…
3.シフト変換
(1)10進数0-Nに対応する配列aの下付きindex=N/32を求めると良いです.indexはnに対応する配列下付きです.
(2)十進数-Nに対応するビットpos=N%32を求めると良いです.
(3)対応する32 bitビットを0-31シフトで1にする
4.コード実現(c++)
『プログラミング珠玉』から来ました.Bit-mapとは、ある要素に対応するValueをビットでマークするもので、Keyはその要素です.Bitを単位としてデータを格納するため、記憶空間においても大幅に節約できる.
例えば、int型の空間を申請すると、4 Bytte、32 bitがあります.入力1,2,3,4 0000 0000 0000,000入力1,000 000,000 000,000,000,000入力2,000,000入力2 0000,000入力3 0000,0000入力3,000 0000 0000,0110入力4,000 0000入力4 0000,000入力4,000 0000入力0000,010入力4,000,000入力0000
2.mapマップテーブル
並べ替えまたは検索が必要な範囲が0~1000であれば、申請するメモリ空間はint a[N/32+1].そのうちa[0]はメモリに32桁を占め、これに類推する.bitmapはa[0]0~31 a[1]32~63 a[2]64~95 a[3]96~127…
3.シフト変換
(1)10進数0-Nに対応する配列aの下付きindex=N/32を求めると良いです.indexはnに対応する配列下付きです.
(2)十進数-Nに対応するビットpos=N%32を求めると良いです.
(3)対応する32 bitビットを0-31シフトで1にする
4.コード実現(c++)
#pragma once
#include
#include
using namespace std;
class BitMap
{
public:
BitMap(size_t range) //
{
_bitmap.resize(range / 32 + 1); //
}
void Set(size_t num) // 1
{
size_t index = num / 32; //
size_t pos = num % 32; //
_bitmap[index] |= (1 << pos);
}
void Reset(size_t num) // 0
{
size_t index = num / 32;
size_t pos = num % 32;
_bitmap[index] &= (~(1 << pos));
}
bool Test(size_t num) //
{
size_t index = num / 32;
size_t pos = num % 32;
return _bitmap[index] & (1 << pos);
}
protected:
vector _bitmap;
};
void TestBitMap()
{
BitMap bm(1000);
bm.Set(1);
bm.Reset(1);
bm.Set(2);
bm.Set(3);
bm.Set(12);
cout<1)<cout<2)<