位图将数字映射到比特位上,用0,1来表示数据存在与否。
适用场景:大量数据(2^32次方约为40亿数据,0.5GB),判断存在与否。
template<size_t N>
class Bitset
{
public:
Bitset()
{
// 在x86下size_t表示四个字节,32个比特位
_bt.resize(N/32+1);
}
// set方法设置x对应比特位为0
void set(size_t x)
{
size_t i=x / 32;
size_t j = x % 32;
_bt[i] |= (1 << j);
}
// reset方法设置x对应比特位为1
void reset(size_t x)
{
size_t i = x / 32;
size_t j = x % 32;
_bt[i] &= ~(1 << j);
}
// 判断是否存在
bool test(size_t x)
{
size_t i = x / 32;
size_t j = x % 32;
return _bt[i] & (1 << j);
}
private:
vector<size_t> _bt;
};
位图可以通过按位与和或操作来实现比特位的控制
值得注意的是,数据在vs上可以为这样储存。但不影响移位。
两个位图:从存不存在,可以少量统计存在次数,两个比特位有四种形式。
template<size_t N>
class TwoBitset
{
public:
TwoBitset()
{}
// 当数据存在设成01,出现两次设成10,
void set(size_t x)
{
if (!bs1.test(x)&&!bs2.test(x))
{
bs1.set(x);
}
else if (bs1.test(x) && !bs2.test(x))
{
bs2.set(x);
}
else
{
;
}
}
void reset(size_t x)
{
bs1.reset(x);
bs2.reset(x);
}
bool test(size_t x)
{
return bs1.test(x) && bs2.test(x);
}
private:
Bitset<-1> bs1;
Bitset<-1> bs2;
};
布隆过滤器:就是一个值映射多个值,一对多的关系。