布隆过滤器

哈哈,闲来无事,无意中看到了这个东西,挺好玩的。

看来一个下午,终于看懂了点皮毛,将看懂的心得和资料整理如下:

  

1.用途:

  在 日常生活中,包括在设计计算机软件时,我们经常要判断一个元素是否在一个集合中。比如在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断它 是否在已知的字典中);在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上;在网络爬虫里,一个网址是否被访问过等等。最直接的方法就是将集合中全部的元素存在计算机中,遇到一个新 元素时,将它和集合中的元素直接比较即可。一般来讲,计算机中的集合是用哈希表(hash table)来存储的。它的好处是快速准确,缺点是费存储空间。当集合比较小时,这个问题不显著,但是当集合巨大时,哈希表存储效率低的问题就显现出来 了。比如说,一个象 Yahoo,Hotmail 和 Gmai 那样的公众电子邮件(email)提供商,总是需要过滤来自发送垃圾邮件的人(spamer)的垃圾邮件。一个办法就是记录下那些发垃圾邮件的 email 地址。由于那些发送者不停地在注册新的地址,全世界少说也有几十亿个发垃圾邮件的地址,将他们都存起来则需要大量的网络服务器。如果用哈希表,每存储一亿 个 email 地址, 就需要 1.6GB 的内存(用哈希表实现的具体办法是将每一个 email 地址对应成一个八字节的信息指纹googlechinablog.com/2006/08/blog-post.html, 然后将这些信息指纹存入哈希表,由于哈希表的存储效率一般只有 50%,因此一个 email 地址需要占用十六个字节。一亿个地址大约要 1.6GB, 即十六亿字节的内存)。因此存贮几十亿个邮件地址可能需要上百 GB 的内存。除非是超级计算机,一般服务器是无法存储的。

  ok,现在就需要引出布隆过滤器了,

2.定义:

  (英语:Bloom Filter)是1970年由巴顿.布隆提出的。它实际上是一个很长的二进制矢量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

  简单的说,就是将字典中的所有字先用随机映射函数映射到很长的二进制向量中,这个过程叫做布隆训练。训练完毕后,这个过滤器就可以开始工作了。对需要过滤的字也将其用随机映射函数映射出来,如果其结果在二进制向量中存在,那么,这个过滤器便会返回“maybe”的结果。如果,不存在,则返回“no”的结果,当然这个返回结果存在布隆过滤器的最大的弊端----误判!也就是“maybe”(^_^布隆:人家明明写的是“maybe”,哪儿误判了?你们净瞎说!)

  误判,应该很好理解,举个栗子,训练的时候,a产生的向量为:1 5 69 87 99(假设向量长度为0-99,随机函数为5个,产生5个随机量)。b产生的向量为:2 9 18 37 54.那么,现在布隆序列里就有1 2 5 9 18 37 54 69 87 99这些值了。而被过滤数c映射出来就是:2 9 37 69 87.本来与a、b都不一样的,但是在布隆序列中这些值是存在的(a+b组合)。这时候,布隆过滤器就会返回“maybe”这个结果(^_^布隆:真相大白了赛,我的判断就是“maybe”)

2.优缺点:

  优点:快速、省空间

  缺点:“误判”、不能删除(现在可以了)。

3.ok,如果还没明白的话,就去看看别人的栗子吧:

  假 定我们存储一亿个电子邮件地址,我们先建立一个十六亿二进制(比特),即两亿字节的向量,然后将这十六亿个二进制全部设置为零。对于每一个电子邮件地址 X,我们用八个不同的随机数产生器(F1,F2, ...,F8) 产生八个信息指纹(f1, f2, ..., f8)。再用一个随机数产生器 G 把这八个信息指纹映射到 1 到十六亿中的八个自然数 g1, g2, ...,g8。现在我们把这八个位置的二进制全部设置为一。当我们对这一亿个 email 地址都进行这样的处理后。一个针对这些 email 地址的布隆过滤器就建成了。(见下图)

  现 在,让我们看看如何用布隆过滤器来检测一个可疑的电子邮件地址 Y 是否在黑名单中。我们用相同的八个随机数产生器(F1, F2, ..., F8)对这个地址产生八个信息指纹 s1,s2,...,s8,然后将这八个指纹对应到布隆过滤器的八个二进制位,分别是 t1,t2,...,t8。如果 Y 在黑名单中,显然,t1,t2,..,t8 对应的八个二进制一定是一。这样在遇到任何在黑名单中的电子邮件地址,我们都能准确地发现。

  布隆过滤器决不会漏掉任何一个在黑名单中的可 疑地址。但是,它有一条不足之处。也就是它有极小的可能将一个不在黑名单中的电子邮件地址判定为在黑名单中,因为有可能某个好的邮件地址正巧对应个八个都 被设置成一的二进制位。好在这种可能性很小。我们把它称为误识概率。在上面的例子中,误识概率在万分之一以下。

  布隆过滤器的好处在于快速,省空间。但是有一定的误识别率。常见的补救办法是在建立一个小的白名单,存储那些可能别误判的邮件地址。 

纯属小白闲来无聊,诸多专业术语都未涉及,以及正确性都有待考证,各位看官手下留情。

原文地址:https://www.cnblogs.com/not-NULL/p/5177879.html