从面试题浅谈布隆过滤器(Bloom Filter)

面试题

不安全网页的黑名单包含 100亿个黑名单网页, 每个网页的URL最多占64字节,现在想要实现一种网页过滤系统,可以根据网页的URL判断该网页是否在黑名单上, 请设计该系统。 要求该系统允许有万分之一一下的判断失误率,并且使用的额外控件不要超过30G。

分析:一般思路基本就是 将黑名单存入  哈希表 或者 数据库。但是显然与题设是不符合的。假设最差的情况, 每个URL占64个字节。

                                        64字节(byte) * 100 亿  =  6400 亿 (byte)  ≈ 640G  空间

很明显,容量远远超过了我们的要求。So, 当我们碰到下列的几种情况的时候:

  • 网页黑名单系统
  • 垃圾邮件过滤系统
  • 爬虫的网址判断重复系统
  • 容忍一定程度的失误率
  • 对空间比较严格

面试官希望得到的答案往往是: 布隆过滤器。

布隆过滤器(Bloom Filter)

本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。  布隆过滤器可以用于检索一个元素是否在一个集合中。 
优点:占用空间小,查询快 
缺点:有误判,不可能100%准确, 删除困难。

具体的实现过程:

我们准备k个哈希函数, 这些哈希函数都很优秀,且彼此独立,给定一个m, 输出域 >= m 。

再准备一个长度为 m 的 bitarray  用来存储信息。里面每一个位置表示一个 bit ,  0值代表白  1值 代表黑

对于每一个黑名单中的URL 都经过下列的流程, 经过k个哈希函数后, 各自对m取模 ,得到 k 个值, 映射到 bitarray 上, 将对应的位置涂黑。 也就是说, 对应位置值为1 时 不变, 值为0, 则变成1。

从面试题浅谈布隆过滤器(Bloom Filter)_第1张图片

在将所有的URL都处理完毕后, bitarray就变成了如下的样子:

其中大部分位置,都被涂黑,也有一部分的位置仍为白。

至此, 一个布隆过滤器就算是设置好了。 那么如何使用来检验一个新的URL是否在黑名单内呢。

我们只要再次经过 k 个 hash函数并且取模, 这样得到的 k个值  与 bitarray进行对比, 只要存在一个值 i  使得 bitarray[i] 这个位置是白色, 那么就可以知道 该 URL 必然不在黑名单之内。但是,绝对不会漏掉黑名单内的URL, 因为如果一个URL在黑名单内了, 那么bitarray中对应的k个位置一定是被涂黑的。

但是, 如果k个值对应的区域都是黑色,也不能说明,URL一定就在这个黑名单之内。因为如果这个bitarray 长度过小,同时黑名单内的URL数量又很多, 势必导致这个bitarray 的绝大部分都是已经被涂黑的。 这样一个URL进来,很可能会被误判为是在黑名单内。故总结一下: 会误判,但是绝对不会漏掉一个!宁可错杀一千,不会放过一个!

布隆过滤器的生成过程

假设:  bitarray大小为m , 样本数量为 n , 失误率为:p;

  • step 1、注意到题目允许有一定程度的失误率
  • step 2、结合样本个数n,和允许的失误率p,再结合以下公式, 求出m。
  • 从面试题浅谈布隆过滤器(Bloom Filter)_第2张图片

  • step 3、根据已经求得的m,以及以下公式,  求得哈希函数个数 k ;
  • 从面试题浅谈布隆过滤器(Bloom Filter)_第3张图片

  • step 4、根据向上取整后的 m, n, k, 在根据以下公式,  可以求得真实失误率 p;
  • 从面试题浅谈布隆过滤器(Bloom Filter)_第4张图片

在本题中, n=100亿, p=0.01%

单个样本的大小是完全不能影响布隆过滤器的大小的,因为  Hash( URL ) %m  ,只要hash函数能处理 64字节的URL就可以。

  • 1、根据  step 2 , 可以求得 m =19.19n , 向上取整可得 , m = 20n 。
  •      所以可以知道生成的bitarray长度为 2000亿, 也就是说大约需要 25G 的空间, 完全符合题设要求。
  • 2、根据 step 3, 可以求得 k = 14。也就是说需要14个独立的hash函数,并能处理64bit的URL。
  • 3、根据 step 4, 代入m,n,k 可以求得 p =0.006%。

至此,我们已经知道, 设计这样的一个布隆过滤器, 完全可以符合面试官的要求啦!

你可能感兴趣的:(算法题,大数据,优化器)