位图法(bitmap),是一个数组用每个数据的每个二进制位表示一个数据的状态,适用于大规模数据。通常用0表示数据不存在,1表示数据存在。如下图所示:
方便实现代码,我们假设数组的数据类型为int,则位图所实现的接口如下:
0.初始化数组
设数据的范围为range,开辟一个大小为(range>>5)+1的数组,并使其初始化为0。
BitSet(size_t range)
{
_set.resize((range >> 5) + 1, 0);
}
1.确定数据应存入的位置
设要存入的数据为num,index表示的是存入数组的哪个数据中,pos表示的是存入数据的哪位二进制位中。
size_t index = num >> 5;
size_t pos = num % 32;
2.设置数据
void set(size_t num)
{
size_t index = num >> 5;
size_t pos = num % 32;
_set[index] |= (1 << pos);
}
3.清除数据
void Reset(size_t num)
{
size_t index = num >> 5;
size_t pos = num % 32;
_set[index] &= ~(1 << pos);
}
4.判断数据是否存在
bool Test(size_t num)
{
size_t index = num >> 5;
size_t pos = num % 32;
return _set[index] & (1 << pos);
}
完整的源代码及测试用例如下:
#include <vector>
class BitSet
{
public:
BitSet(size_t range)
{
_set.resize((range >> 5) + 1, 0);
}
void set(size_t num)
{
size_t index = num >> 5;
size_t pos = num % 32;
_set[index] |= (1 << pos);
}
void Reset(size_t num)
{
size_t index = num >> 5;
size_t pos = num % 32;
_set[index] &= ~(1 << pos);
}
bool Test(size_t num)
{
size_t index = num >> 5;
size_t pos = num % 32;
return _set[index] & (1 << pos);
}
protected:
vector<int> _set;
};
void TestBitSet()
{
BitSet s(10000);
s.set(1);
s.set(7);
s.set(33);
}