为什么说位图是应用于海量数据的查找呢?
当数据不多时,我们要对一个数据进行查找,通常会用哈希表进行存储进行查找,但当数据很多时,显然对于内存有限的空间是不行的,例如说:
给定40亿个整数,要快速判断一个值是否在这其中?
40亿整数=40亿*4
而整数的范围为0到42亿9千万,内存是肯定不够的,那该如何处理呢?
所以有了位图这种方法:
我们存储一个整数要4个字节=32比特位,而我们要查找一个数在不在,可以不用将数据进行拷贝存储,只要将数据进行标识就行了,所以我们可以用一个比特位进行映射标识,在,就将一个对应bit置为1;不在,就将一个对应bit置为0,这样原本32位才能标识的一个数,用1bit就能标识,大大的节省了空间
#include<iostream>
#include<vector>
using namespace std;
class BitSet
{
public:
//初始化开空间
BitSet(size_t range)
{
_bits.resize((range >>5) + 1, 0);
}
//将数映射在位图上
void Set(size_t x)
{
//找到对应位置
size_t num = x >> 5;
size_t pos = x % 32;
//置为1,表示在这个位图中
_bits[num] |=( 1 << pos);//将pos位置为1
}
void Reset(size_t x)
{
size_t num = x >> 5;
size_t pos = x % 32;
_bits[num] &=~( 1 << pos);//将pos位置为0
}
//测试某一个数在不在
bool Test(size_t x)
{
size_t num = x >> 5;
size_t pos = x % 32;
return _bits[num] & (1 << pos);
}
protected:
vector<size_t> _bits;
};
void TestBitSet()
{
BitSet bs(-1);//开整数最大空间,也可以将32个2相乘
bs.Set(110);
bs.Set(1);
bs.Set(11000);
bs.Set(300000);
cout << bs.Test(1) << endl;//在:1
cout << bs.Test(110) << endl;//1
cout << bs.Test(5) << endl;//0
}