不求甚解之布隆过滤器

Posted 数据100

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不求甚解之布隆过滤器相关的知识,希望对你有一定的参考价值。

一.基本概念:什么是布隆过滤器

布隆过滤器是一个空间效率较高的数据结构,主要用于检测某元素是否在某特定集合之中。它由Burton Howard Bloom于1970年发表,并以布隆的名字进行命名。

布隆过滤器有可能产生False positive,但不会产生False negatives。换句话说,针对元素是否在集合中的查询结果是“可能存在集合中”或“肯定不存在集合中”。同时,也就意味着布隆过滤器有一定的误报率(即元素本不在集合之中,但布隆返回结果称该元素存在集合中),并且集合中的元素数量越多,误报率也会越来越高。

除此以外,布隆过滤器中的元素无法删除。

二.产生背景:为什么需要布隆过滤器

在计算机软件领域,有很多需要判断一个元素是否在一个集合中的场景。比如网络爬虫判断一个网址是否已经被访问过,比如判断该文章标题是否已经重复,以及在存储系统中判断一个key是否在存储体中等等。最简单粗暴的方式就是将要被对比的元素集合全量存在计算机上,然后让新元素与集合中的元素进行比较,判断是否包含在集合内。

一般来讲,计算机中的集合使用哈希表进行存储,它的好处是快速准确,缺点是消耗存储空间。如果需要判断的集合数量较小,那么问题并不显著,但如果集合数量巨大的时候,哈希表存储效率低的问题就显现出来了。

而在此基础上,布隆过滤器在空间和时间方面都有巨大的优势。

三.主要流程介绍:

  1. 首先,需要长度为M比特的数组,并初始化都为0;

  2. 其次,需要K个hash函数,每个hash函数对key(元素)生成一个散列值(1个整数),共可以生成K个散列值;

  3. 再此,根据K个散列值依次把数组中对应位置的比特位置为1;

  4. 最后,如果判断某个key是否在此集合中,则用K个hash函数计算出K个散列值,并查询对应的数组中的比特位是否为1;如果都为1,则判断该key存在集合中;

 

举个“栗子”,如下图示:集合为{x,y,z},有M=18个比特数组,有K=3个hash函数,不同的key对应了不同的散列值位置(彩色线表示对应位置关系)。判断“w”是否包含在集合中时,由于其散列值对应比特位不全为1,所以“w”不包含在集合中。

 

四.优缺点:布隆的优缺点是什么

    优点:

  • 不需要存放key的值,节省了空间,同时适用于保密要求比较高的场景;

  • 布隆过滤器存储空间和插入/查询时间都是常数O(k);

  • 布隆过滤器可以表示数据全集;

    缺点:

  • 存在误判率;随着存入元素的增加误判率也会增加;

  • 无法删除集合中的元素,因为无法保证删除数据的安全性;

五.应用场景:布隆有哪些应用场景

其实只要是在大量数据基础下,判断元素是否属于某个集合的场景都适用。以下仅列举部分:

  • 加快数据库查询:Google的BigTable使用布隆过滤器来查找不存在的行或列,以减少磁盘IO次数;在很多K-V数据库中也使用布隆过滤器来加快查询,如Hbase,LevelDB等,一般而言value保存在磁盘中,访问磁盘需要大量时间,应用布隆过滤器可以快速判断该key对应的value是否存在,从而避免不必要的IO。

  • 前端页面的缓存系统,当缓存系统频繁的查询一个页面时,缓存系统会频繁的请求后端(确定缓存内容是否正确),会把查询压力导入后端,可以加入布隆过滤器来判断是否存在。

  • 垃圾邮件/短信的判别:即将需要过滤的邮件email列表全部记录下来,即黑/白名单,当数据量巨大的时候,可以引入布隆过滤器;

  • 判断唯一性/去重,比如说网页爬虫中的URL去重;

  • 字典纠正/拼写检查;

六.其他补充:

  1. 关于误判率的简要说明

误判率的概率推导有一系列过程,大概是将每次hash都当作独立事件,那么就依次可以得出某比特位是1 的概率,以及正好某几个比特位都为1的概率。具体如有兴趣,请参看网上推导资料。以下仅列出最终的误判率公式:

即检测一个不在集合中的元素,但经过k个hash过后所有比特位上均为1的概率。其中m表示比特数组大小,n表示当前集合数量,k表示hash函数个数:

最主要想说明的是以下内容:m数量越大,误判率越小;n数量越大,误判率越高;并且当m 和 n给定之后让误判率最小的k值为:

当然,其实再用的时候一般不需要考虑其推导过程,一般接口函数都会给定一个参数来指定误判率,接口函数会自动根据误判率来分配相对应的m大小和 k大小。


以上是关于不求甚解之布隆过滤器的主要内容,如果未能解决你的问题,请参考以下文章

C++从青铜到王者第二十一篇:哈希的应用之位图布隆过滤器

亿级数据之过滤器布隆过滤器

大数据之布隆过滤器学习

hbase之布隆过滤器

Redis 高级主题之布隆过滤器(BloomFilter)

干货|海量数据处理利器之布隆过滤器