bitmap 位存储实现海量数据的标记

针对海量的数据,一般的内存无法存储,提供一种位存储的标记方法?

如给定10亿个数字,询问其中任意一个数字是否出现,采取传统的存储方式,以32位机器为例

一个int占用32位,也就是4字节  

而bitmap的思想是,无符号int类型的范围是确定的 即0~2的32次方-1

那么将一个int拆分开来看,其包含32个bit  若其中一个Bit为1那么标记原先的数字存在  那么对于一组int

第一个int: 表示0~31这32个数字

第二个int: 表示32~63这32个数字

......

对于任意一个整数key

key/32可以定位到所在的int (那么这里一个int相当于一个bucket桶)

key%32可以定位到具体在该int的哪一位

 

具体实现采取位操作:

set(key)标记一个key数字存在  将对应bit设置为1    注意采取按位或  避免其他位置的bit呗修改

void set(int key)  //设置key数字为true     找到对应所在的bit下标
    {
        int index = key >>5;//相当于key/5
        int off_set = key % 32;//所在int的bit偏移
        //将1左移off_set位  并与原先的数字做按位或运算  (不改变原先的其他位的数字)
        arr[index] = arr[index] | (1 << off_set);

    }

reset(key)删除一个key  将对于bit设置为0

   void reset(int key)  //删除key数字
    {
        int index = key >> 5; //找到所在的桶
        int off_set = key % 32;
        //将1左移off_set位 取反   并与原先的int数字按位与运算   不改变原先的其他位的数字
        arr[index] = arr[index] & (~(1 << off_set));
    }

exits判断某个数是否存在


    bool exist(int key)
    {
        int index = key >> 5;
        int off_set = key % 32;
        if (arr[index] & (1 << off_set))  //判断原先int桶中off_set位bit是否为1   采取按位与运算
            return true;
        else
            return false;
    }

完整bitmap类的实现:

class bitmap
{

private:

    vector arr;
public:
    bitmap(int size)//初始化为大小 bitmap   范围大小为size
    {
        arr.resize((size>>5)+1);  //一个int包含32bit   因此总共需要   size>>5大小的int
    }
    void set(int key)  //设置key数字为true     找到对应所在的bit下标
    {
        int index = key >>5;//相当于key/5
        int off_set = key % 32;//所在int的bit偏移
        //将1左移off_set位  并与原先的数字做按位或运算  (不改变原先的其他位的数字)
        arr[index] = arr[index] | (1 << off_set);

    }
    void reset(int key)  //删除key数字
    {
        int index = key >> 5; //找到所在的桶
        int off_set = key % 32;
        //将1左移off_set位 取反   并与原先的int数字按位与运算   不改变原先的其他位的数字
        arr[index] = arr[index] & (~(1 << off_set));
    }

    bool exist(int key)
    {
        int index = key >> 5;
        int off_set = key % 32;
        if (arr[index] & (1 << off_set))  //判断原先int桶中off_set位bit是否为1   采取按位与运算
            return true;
        else
            return false;
    }
};

 

你可能感兴趣的:(数据结构)