Bloom Filter

布隆过滤器 ——多哈希函数映射的快速查找算法

背景

我们可以考虑一些应用场景:

  • 在网络爬虫里,一个网址是否被访问过
  • yahoo, gmail等邮箱的垃圾邮件过滤功能
  • 文档存储检查系统检测先前存储的数据

以上问题都涉及到:在数据集中查找、检索某一元素

通常遇到元素查找问题,我们使用链表、树、散列表(又叫哈希表,Hash table)等等数据结构来实现。但是随着集合中元素的增加,数据量达到500万甚至1亿的时候,就会出现存储空间与检索速度上的问题。这个时候,布隆过滤器(Bloom Filter)就应运而生。

Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。布隆过滤器可以用于检索一个元素是否在一个集合中。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

原理

  1. 创建一个m位BitSet(位数组),先将所有位初始化为0,然后选择k个不同的哈希/散列函数;
  2. 添加元素:当一个元素加入集合,通过k个哈希/散列函数将该元素映射成一个位数组中的k个点,并把它们置为1;在这里插入图片描述 3. 查询元素:检索时,我们通过看对被检元素映射后得到的这些点是不是都是1可以判断集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。

在这里插入图片描述

Bloom Filter存在一定的误判率:以上图为例,假设集合里面有3个元素{x, y, z},哈希函数的个数为3。首先将位数组进行初始化,将里面每个位都设置位0。对于集合里面的每一个元素,将元素依次通过3个哈希函数进行映射,每次映射都会产生一个哈希值,这个值对应位数组上面的一个点,然后将位数组对应的位置标记为1。
假设某个元素通过映射对应下标为4,5,6这3个点。虽然这3个点都为1,但是很明显这3个点是不同元素经过哈希得到的位置,因此这种情况说明元素虽然不在集合中,也可能对应的都是1,因此在查询检索时会产生误判。

优缺点

优点是空间效率和查询时间都远远超过一般的算法(添加和查询时间都是常数O(k)),缺点是有一定的误判率删除困难(必须保证删除的元素的确在布隆过滤器里面)。

参考与拓展
[1].https://zhuanlan.zhihu.com/p/85083632
[2].https://www.jianshu.com/p/88c6ac4b38c8
[3].Wikipedia. Bloom filter
[4].哈希函数个数k、位数组大小m、加入的字符串数量n的关系

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值