アルゴリズム学習-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バイトです.
このとき、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を使いました.