C++ 哈希扩展:位图与布隆过滤器详解及实现
一、位图(BitMap)
1. 概念与实现
在处理海量数据时,比如判断 40 亿个不重复无符号整数中某个数是否存在,暴力遍历 O(N) 太慢,排序加二分查找 O(NlogN) 内存又不够。这时候位图是个好选择。
位图本质上是一个直接定址法的哈希表。每个整型值映射到一个比特位,1 代表存在,0 代表不存在。我们可以设计一个用比特位表示数据是否存在的数据结构——位图!

位图提供控制这个比特位的相关接口,最主要的是 set、reset、test:
namespace lydly {
template<size_t N>// 模版参数表示有多少个数据
class Bitset {
public:
Bitset() {
// 一个 int 有 32 位,+1 为了向上取整,初始全用 0 填充
_bits.resize(N / 32 + 1, 0);
}
void set(size_t x) // 将一个数的映射位设为 1
{
// i 找这个数在第几个 int
// j 找这个数在这个 int 中的第几个位
// 利用或运算将这一位设为 1,不改变其他位
size_t i = x / 32;
size_t j = x % 32;
_bits[i] |= (1 << j);
}
void reset(size_t x) // 将一个数的映射位设为 0
{
// i 找这个数在第几个 int
// j 找这个数在这个 int 中的第几个位
// 利用且运算将这一位设为 0,不改变其他位
i = x / ;
j = x % ;
_bits[i] &= ~( << j);
}
{
i = x / ;
j = x % ;
_bits[i] & ( << j);
}
:
vector<> _bits;
};
}







