本文主要是介绍布隆过滤器(Bloom Filter)基础知识,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
布隆过滤器(Bloom Filter)基础知识
布隆过滤器 (Bloom Filter)是由Burton Howard Bloom于1970年提出,它是一种space efficient的概率型数据结构,用于判断一个元素是否在集合中。在网页黑名单系统、垃圾邮件过滤的黑白名单方法、爬虫(Crawler)的网址判重模块中等等经常被用到。哈希表也能用于判断元素是否在集合中,但是布隆过滤器只需要哈希表的1/8或1/4的空间复杂度就能完成同样的问题。布隆过滤器可以插入元素,但不可以删除已有元素。其中的元素越多,false positive rate(误报率)越大,但是false negative (漏报)是不可能的。
一个布隆过滤器精确的代表一个集合,并可以精确判断一个元素是否在集合中。注意,只是精确代表和精确判断,到底有多精确?则完全在于你的具体设计,但想做到完全正确是不可能的。布隆过滤器的优点就在于使用很少的空间就可以将准确率做到很到的程度。
首先介绍哈希函数(散列函数)的概念。哈希函数的输入域可以是非常大的范围,比如,任意一个字符串,但是输出域是固定的范围,假设为S,并具有以下性质:
1、典型的哈希函数都有无限的输入域值。
2、当给哈希函数传入相同的输入值时,返回值一样。
3、当给哈希函数传入不同的输入值时,返回值可能一样,也可能不一样,这是当然的,因为输出域统一是S,所以会有不同的输入值对应在S中的一个元素上。
4、最重要的性质是很多不同的输入值得到的返回值会均匀地分布在S上。
接下来介绍布隆过滤器。假设有一个长度为m的bit类型数组,即数组中每一个位置只占一个bit,如我们所知,每一个bit只有0和1两种状态,如下图所示:
再假设一共有k个哈希函数,这些函数的输出域S都大于或等于m,并且这些哈希函数足够优秀,彼此之间也完全独立。那么对于同一个输入对象(假设是一个字符串记为URL),经过k个哈希函数算出来的结果也是独立的,可能相同,也可能不同,但彼此独立,对算出来的每一个结果都对m取余(%m),然后在bit array上把相应的位置设置为1(涂黑),如果所示:
我们把bit类型的数组记为bitMap。至此。一个对象对bitMap的影响过程结束,也就是bitMap中一些位置被涂黑。接下来按照该方法处理所有的输入对象,每个对象都可能把bitMap中一些白位置涂黑,也可能会遇到已经涂黑的位置,遇到已经为黑的让他继续为黑即可。处理完所有的输入对象之后,在bitMap中可能已经有相当多的位置已经被涂黑。至此,一个布隆过滤器生成完成,这个布隆过滤器代表之前所有输入对象组成的集合。
详细介绍请参考http://www.cnblogs.com/allensun/archive/2011/02/16/1956532.html
http://www.cnblogs.com/KevinYang/archive/2009/02/01/1381803.html
这篇关于布隆过滤器(Bloom Filter)基础知识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!