アルゴリズム学習-bitmap実装(c++)
BitMapの紹介
ここでBitMapとは,ビット単位のデータ構造にデータを格納することである.各ビットには0と1の2つの値しかありません.0の場合、証明値は存在しません.1の場合は存在します.
例として、
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
これは24ビット、つまり24 bitで、同時に8 bitは1バイトです.ここの空間は3バイトです.
このとき、
[0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0]
これにより、
BitMap実装
実はBitMapの実現は難しくありませんが、普段はビット演算が特に多くないかもしれません.だからよく知らない.
主な操作は3つあり、初期化に加えて
コード実装は次のとおりです.
呼び出し方法は、みんなできるはずです.コードは比較的簡単で、私の下のブログはBloom Filterを書くことができて、このBitMapを使いました.
ここでBitMapとは,ビット単位のデータ構造にデータを格納することである.各ビットには0と1の2つの値しかありません.0の場合、証明値は存在しません.1の場合は存在します.
例として、
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
これは24ビット、つまり24 bitで、同時に8 bitは1バイトです.ここの空間は3バイトです.
このとき、
2 4 6 8 9 10 17 19 21
という数字をBitMapに保存するには、対応するビットを1
に設定するだけでいいです.[0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0]
これにより、
9 * sizeof(int)
サイズの数字を3バイトで保存しました.64ビットコンパイラでは、一般的に1つのint
タイプが32bit
、つまり4バイトです.私たちはこんなにたくさんの数字を保存して、intの空間さえありません.BitMap実装
実はBitMapの実現は難しくありませんが、普段はビット演算が特に多くないかもしれません.だからよく知らない.
主な操作は3つあり、初期化に加えて
set() get() del()
の方法であり、この3つはindexを1に、1つはindexビットを得る0 or 1
であり、最後にindex位置ビット0である.コード実装は次のとおりです.
//
// Header.h
// BloomFilter
//
// Created by Alps on 15/3/19.
// Copyright (c) 2015 chen. All rights reserved.
//
// BitMap.h 。
class BitMap{
public:
BitMap(){
bitmap = NULL;
size = 0;
}
BitMap(int size){ // contractor, init the bitmap
bitmap = NULL;
bitmap = new char[size];
if (bitmap == NULL) {
printf("ErroR In BitMap Constractor!
");
}else{
memset(bitmap, 0x0, size * sizeof(char));
this->size = size;
}
}
/* * set the index bit to 1; */
int bitmapSet(int index){
int addr = index/8;
int addroffset = index%8;
unsigned char temp = 0x1 << addroffset;
if (addr > (size+1)) {
return 0;
}else{
bitmap[addr] |= temp;
return 1;
}
}
/* * return if the index in bitmap is 1; */
int bitmapGet(int index){
int addr = index/8;
int addroffset = index%8;
unsigned char temp = 0x1 << addroffset;
if (addr > (size + 1)) {
return 0;
}else{
return (bitmap[addr] & temp) > 0 ? 1 : 0;
}
}
/* * del the index from 1 to 0 */
int bitmapDel(int index){
if (bitmapGet(index) == 0) {
return 0;
}
int addr = index/8;
int addroffset = index%8;
unsigned char temp = 0x1 << addroffset;
if (addr > (size + 1)) {
return 0;
}else{
bitmap[addr] ^= temp;
return 1;
}
}
private:
char *bitmap;
int size;
};
呼び出し方法は、みんなできるはずです.コードは比較的簡単で、私の下のブログはBloom Filterを書くことができて、このBitMapを使いました.