基本概念
布隆过滤器(Bloom Filter)是1970年由布隆提出的,由二进制矢量
和一系列的hash函数
组成,布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率
和查询时间
都远远超过一般的算法,缺点是有一定的误识别率
和删除困难
。
算法描述
构造Bloom filter:初始状态时,Bloom Filter包含m位的位数组,每一位都置为0,并且包含k个hash函数(k远小于m),当一个元素加入集合时,通过k个hash函数将隔着 元素映射到m中的k个点,并把他们置为1。
判断一个元素是否在结合中:
(1) 如果经过k个hash函数映射到m的位置全部为1时,则元素
可能
存在
(2) 如果经过k个hash函数映射到m的位置至少有一个为0时,则元素一定
不存在
样例:
在下图中,m值为18,hash函数的个数为3,集合为{x,y,z},每个带颜色的线指向一个元素对应到位数组的位置,w元素不在集合中。
错误率计算
假设每个hash函数能够等概率的映射到位数组的每一个位置,m是位数组的容量,在插入一个元素时,
一个位置
不会被一个hash函数
设置为1的概率是:
$$1-frac{1}{m}$$
如果k是hash函数的数量,那么一个位置不会被任何一个hash函数置为1的概率为:
$$(1-frac{1}{m})^k $$
如果我们已经向位数组中插入了n个元素,一个位置不会被置为1的概率是:
$$(1-frac{1}{m})^{kn}$$
是1的概率是
$$1-(1-frac{1}{m})^{nk}$$
一个元素经过一组hash函数之后又k个位置,那么如果这个元素不在集合中而被误判的概率是:
$$(1-[1-frac{1}{m}]^{kn})^k approx (1-e^{frac{-kn}{m}})^k$$
优点和缺点
优点:
相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数(O(k))。另外, 散列函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。
布隆过滤器可以表示全集,其它任何数据结构都不能;
k和m相同,使用同一组散列函数的两个布隆过滤器的交并差运算可以使用位操作进行。
缺点:
但是布隆过滤器的缺点和优点一样明显。误算率是其中之一。随着存入的元素数量增加,误算率随之增加。但是如果元素数量太少,则使用散列表足矣。
另外,一般情况下不能从布隆过滤器中删除元素. 我们很容易想到把位数组变成整数数组,每插入一个元素相应的计数器加1, 这样删除元素时将计数器减掉就可以了。然而要保证安全地删除元素并非如此简单。首先我们必须保证删除的元素的确在布隆过滤器里面. 这一点单凭这个过滤器是无法保证的。另外计数器回绕也会造成问题。
在降低误算率方面,有不少工作,使得出现了很多布隆过滤器的变种。
参考文献:
【1】Bloom filter, https://en.wikipedia.org/wiki/Bloom_filter
【2】布隆过滤器 https://zh.wikipedia.org/wiki/%E5%B8%83%E9%9A%86%E8%BF%87%E6%BB%A4%E5%99%A8
【3】海量数据处理之Bloom Filter详解 http://blog.csdn.net/v_july_v/article/details/6685894
博客