【学习笔记】Bloom Filter(布隆过滤器)

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。Bloom filter的原理可以参考:维基百科【1】、论文【2】、网络文章【3】,还有文章【4】中有简单的程序实现。


我的总结:

1、Bloom Filter的原理非常简单,可以说是对Bit-map的扩展,Bit-map是用一个hash函数将数据映射到位数组的某一位,而Bloom Filter是用k个hash函数将数据映射到位数组的k位,检测时只有当k位都置为1才认为该数据存在;

2、Bloom Filter相对于Bit-map的优势。Bit-map实际上就是一个hash表,hash表的最常见的问题是地址冲突,文章【4】中提到“若要降低冲突发生的概率到1%,就要将BitSet的长度设置为URL个数的100倍。”,而Bloom Filter因为使用了多个hash函数,所以冲突的概率是非常低的,论文【2】中对Bloom Filter的错误概率进行了分析。总的来说,Bloom Filter出错概率要低,而且空间效率要高;

3、若位数组大小为m、加入的数据为n、哈希函数个数为k,文献【2】中证明了对于给定的m、n,当 k = ln(2)* m/n 时出错的概率是最小的;

4、Bloom Filter的特点:①不保存原始数据;②不能对插入的数据进行计数;③插入的数据是不能删除的,因为删除(即清除对应的k个bit位)会影响别的数据映射的bit位。相比之下,Bit-map是可以删除数据的(因为数据到bit位是一一对应的);

5、应用场合,由Bloom Filter的特点(不保存原始数据、无法计数、无法删除等)可知,非常适合于记录和查询某些数据是否“出现”过,例如网络爬虫为了避免重复爬取网页需要记录访问过的URL(文献【4】中列出并比较了该应用例子的不同方法),就可以将URL映射到Bloom Filter的位数组中。当然,适用Bloom Filter有一个前提——允许有一定的错误率!


参考文献:

【1】http://en.wikipedia.org/wiki/Bloom_filter
【2】http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html
【3】http://blog.csdn.net/jiaomeng/article/details/1495500
【4】http://www.cnblogs.com/heaad/archive/2011/01/02/1924195.html

你可能感兴趣的:(【学习笔记】Bloom Filter(布隆过滤器))