布隆过滤器
- 布隆过滤器(BloomFilter)是一种空间效率很高的随机数据结构,可以看做是对位图(bit-map)的扩展;
- 原理是:当一个元素被加入集合时,通过 K 个 Hash 函数将这个元素映射成一个位阵列(Bitarray) 中的 K 个点,并将它们置为 1。在检索一个元素是否在一个集合中时,我们只要看看这些点是不是都是 1 就能大约判断出集合中有没有它了:如果这些点有任何一个 0,则被检索元素一定不在;如果都是 1,则被检索元素很可能存在集合中(因为哈希函数的特点,两个不同的数通过哈希函数得到的值可能相同);
- 布隆过滤器有一定的误判率:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合。因此,它不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,布隆过滤器通过极少的错误换取了存储空间的极大节省;
- 补救方法:布隆过滤器存在一定的误识别率。常见的补救办法是在建立白名单,存储那些可能被误判的元素。
1 寻找通过 URL
问题
给你 A,B 两个文件,各存放 50 亿条 URL,每条 URL 占用 64 字节,内存限制是 4G,让你找出 A,B 文件共同的 URL。
分析
如果允许有一定的错误率,可以使用布隆过滤器,4G 内存大概可以表示 320 亿 bit。
步骤
将其中一个文件中的 url 使用布隆过滤器映射为这 340 亿 bit,然后读取另外一个文件的 url,使用布隆过滤器进行判重,如果是重复的,那么该 url 就是共同的 url(允许有一定的错误率的情况)。
2 垃圾邮件过滤
问题
如何过滤垃圾邮件。
分析
比较直观的想法是把常见的垃圾邮件地址存到一个巨大的集合中,然后遇到某个新的邮件,将它的地址和集合中的全部垃圾邮件地址一一进行比较,如果有元素与之匹配,则判定新邮件为垃圾邮件。如果允许一定的误判率的话,我们可以使用布隆过滤器。