布隆过滤器的提出
我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。问题来了,新闻客户端推荐系统如何实现推送去重的? 用服务器记录了用户看过的所有历史记录,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那些已经存在的记录。 如何快速查找呢?
- 用哈希表存储用户记录,缺点:浪费空间
- 用位图存储用户记录,缺点:不能处理哈希冲突
- 将哈希与位图结合,即布隆过滤器
布隆过滤器概念
布隆过滤器是由布隆
在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询
,可以用来告诉你 “某样东西一定不存在或者可能存在”
,它是用多个哈希函数
,将一个数据
映射到位图结构中。此种方式不仅可以提升查询效率,也可以节省大量的内存空间。
哈希函数和布隆过滤器的长度
假设有3个哈希函数,那么大约m=4n。
位图的代码
namespace g
{
template<size_t N>
class bitset
{
public:
bitset()
{
_bits.resiez(N / 32 + 1,0);
}
void set(size_t pos)
{
assert(pos < N);
//计算pos映射在第几个数的多少位
int i = pos / 32;
int j = pos % 32;
_bits[j] |= (1 << j);//将该位置设为1
}
void reset(size_t pos)
{
assert(pos < N);
//计算pos映射在第几个数的多少位
int i = pos / 32;
int j = pos % 32;
_bits[j] &= (~(1 << j));//左移取反在相与
}
void filp(size_t pos)
{
assert(pos < N