Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。
Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,采用Bloom Filter的数据结构,可以通过极少的错误换取了存储空间的极大节省。
Bloom filter由2部分组成:1套k hash函数,1个给定长度的位向量。选择位向量的长度,和hash函数的数量,依赖于我们想增加多少keys到设置中,以及我们能容忍的多高的假命中率。
使用范例:如果我们想判断一个邮件地址是不是记录在黑名单中的垃圾邮件地址,则使用Bloom filter可以实现。
支持的操作:
将一个元素加入集合:首先将要加入集合的元素用k个hash函数进行hash,得到k个hash index,然后在集合的位数组中将这k个hash index的位置置1。
查找元素是否属于该集合:首先同样用定义的hash函数对该元素进行hash得到hash index,然后查位数组中对应的hash index是否都是1,如果是,则表明该元素属于该集合,反之不属于,不过存在误判的可能。
存在的问题:1. 把不存在于集合中的元素误判为存在于集合中
2. 不支持删除(可用改进版的counting bloom filter来弥补)。
其他的详细问题不在这里介绍了,可参考:http://blog.youkuaiyun.com/jiaomeng/article/category/275566/1