原文地址:http://minidb.sinaapp.com/?p=112
首先最重要的是要搞清楚Bloom Filter是做什么的,看了几篇文章的表述,其实最根本的就是:
判断一个元素是否属于这个集合。
如果这个集合中的元素足够多,那么通过传统方法进行如上判断耗时会很多,Bloom Filter就是一种利用很少的空间换取时间的非常实用的方法。但是要说明的是:Bloom Filter的这种高效是有一定代价的,在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省。
下面描述下Bloom Filter的原理:
Bloom Filter是m位的数组,且这m个数组的每一位都是零。
Step 1 映射:假如我们有A={x1,x2,x3….xn} n个元素,那么我们需要k个相互独立的哈希函数,将其中每个元素进行k次哈希,他们分别将这个元素映射到m位的数组中,而其映射的位置就置为1,如果有重 复的元素映射到这个数组的同一个元素,那么这个元素只会记录一次1,后续的映射将不会改变的这个元素的值。如图:
Step 2 判断:在判断B={y1,y2} 这两个元素是否属于A集合时,我们就将这两个元素分别进行上步映射中的k个哈希函数的哈希,如果结果全为1,那么就判断属于A集合,否则判断其不属于A集合。如下图 y2属于,y1则不属于。