布隆过滤器
布隆过滤器是一个高空间利用率的概率(space-efficient probabilistic)数据结构,被用来检验一个元素是否在一个集合中。
特点
可能会报告一个不在集合中的元素在集合中(false positive are possible)
但在报告不在集合中的元素一定不在集合中(False negative are impossible)
使用场景举例
-
垃圾邮件过滤
-
重复检查
如爬虫中,判断一个URL是否被爬过
-
拼写检查器
使用方法
设集合S有n个元素,有k个哈希函数,记为 h 1 , h 2 , ⋯ , h k h_1,h_2,\cdots,h_k h1,h2,⋯,hk。这些哈希函数将集合中的元素映射到结合{ 1 , 2 , ⋯ , m 1,2,\cdots,m 1,2,⋯,m}。用一个长度为m集合保存哈希函数的映射结果(将集合对应位置设为1),这个集合称为布隆过滤器
当给出一个元素y,判断其是否在集合S中时,使用哈希函数 h 1 , h 2 , ⋯ , h k h_1,h_2,\cdots,h_k h1,h2,⋯,hk映射,得到一个集合如{4,5,9},去布隆过滤器中查看,对应位置是否都为1。若都为1则返回在集合中,若否,则返回不在集合中。
经过简单分析即可判断满足上述特点。
原理
False Positive rate:
f
=
(
1
−
(
1
−
1
m
)
k
n
)
k
≈
(
1
−
e
−
k
n
/
m
)
k
f=\left(1-\left(1-\frac{1}{m}\right)^{k n}\right)^{k} \approx\left(1-e^{-k n / m}\right)^{k}
f=(1−(1−m1)kn)k≈(1−e−kn/m)k