布隆过滤器
布隆过滤器
布隆过滤器(Bloom Filter)是由布隆( Burton Howard Bloom)在1970年提出的算法:是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率(假正例False positives,即Bloom Filter报告某一元素存在于某集合中,但是实际上该元素并不在集合中)和删除困难,但是没有识别错误的情形(即假反例False negatives,如果某个元素确实没有在该集合中,那么Bloom Filter 是不会报告该元素存在于集合中的,所以不会漏报)。
算法流程
如果我们要映射一个值到布隆过滤器中,我们可以使用多个不同的哈希函数生成多个哈希值,并对每个生成的哈希值指向的 bit 位置 1:
当查询某一个值是否存在集合中的是否,则同样经过相同次数的哈希运算,若映射到的每个bit位都为1,那么说明该元素有可能属于该集合,否则则说明该元素一定不属于该集合。
误差率表
令\(m\)表示过滤器的bit位数,\(n\)为总的输入数据量,\(k\)为哈希函数的个数,那么判断一条不存在的数据却返回存在结果的误差率\(p\)为:
\[p=\left(1-e^{\frac{-nk}{m}}\right)^k
\]
下面是m/n和k的值对p的影响统计表: