布隆过滤器
一、简介
布隆过滤器是由伯顿·布隆于1970年提出的。布隆过滤器实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器用于判断一个元素是否在一个集合中,它只有插入元素和查询元素是否存在两种操作。
哈希表也有与布隆过滤器同样的功能,但是布隆过滤器只需要哈希表的$1/8$到$1/4$的大小就可以解决相同的问题,但是布隆过滤器可能存在误识别的问题,后续给出误识别的概率计算。
二、应用
- 建立初始环境:假设存储一亿个电子邮件地址,建立16亿个比特位,即一个两亿字节的向量,将16亿个比特位清零。
- 插入元素:对于要插入的每一个电子邮件地址,使用8个不同的随机数生成器($F_1$,$F_2$,…,$F_8$),生成8个信息指纹($f_1$,$f_2$,…,$f_8$),再使用一个随机数产成器G将8个信息指纹映射到1-16亿中的八个自然数($g_1$,$g_2$,…,$g_8$)。在16亿个比特位中将这8个自然数位置的比特位置为1。
- 查询元素:对于一个需要查询的邮件地址,使用相同的八个随机数生成器和随机数产生器得到八个自然数($t_1$,$t_2$,…,$t_8$),如果在16亿个比特位向量中对应的比特值为1,则判断为元素存在。
问题:有极小的概率误判元素存在,因为有可能某个邮件地址在布隆过滤器中的对应的8个位置恰巧被设置为1。
三、误识别概率计算
假设布隆过滤器有m个比特位,已经插入了n个元素,每个元素使用k个散列函数。
在布隆过滤器中插入一个新的元素时,元素的第一个散列函数会将布隆过滤器中的某一位设置为1,因此某一位被设置为1的概率是${ {1}\over{m} }$(因为一共有m个比特位,每一个比特位被设置为1的概率是相同的,都是${ {1}\over{m} }$),某一位没有被设置为1的概率是$1-{ {1}\over{m} }$。
对于布隆过滤器中的一个特定的位置,插入一个元素,k个散列函数都没有将它置为1的概率是$(1-{ {1}\over{m} })^k$。插入第二个元素,该位置仍然没有被设置为1的概率是$(1-{ {1}\over{m} })^{2k}$。如果插入了n个元素,该位置仍然没有被置为1的概率是$(1-{ {1}\over{m} })^{nk}$。反过来,该位置被置为1的概率是$1-(1-{ {1}\over{m} })^{nk}$。
假定n个元素都已经插入到了布隆过滤器中,新来一个不在集合(即n个元素组成的集合)中的元素,新元素的第一个散列函数正好命中一个被置为1的位置的概率是上述计算的概率是$1-(1-{ {1}\over{m} })^{nk}$,如果新元素被误识别为在集合中,那么k个散列函数都命中了被置为1的位置,其概率为
$$(1-(1-{ {1}\over{m} })^{nk})^k \approx (1-e^{ {-nk}\over{m} })^k$$
化简后为
$$p = (1-e^{ {-ln({ {m}\over{n} }ln2)n}\over{m} })^{ln({ {m}\over{n} }ln2)}$$
如果n值比较大,可以近似为
$$(1-e^{ {-k(n+0.5)}\over{m-1} })^k \approx (1-e^{ {-kn}\over{m} })^k$$
误识别率参考表,来源于Bloom Filters - the math
m**/**n | k | k=1 | k=2 | k=3 | k=4 | k=5 | k=6 | k=7 | k=8 |
---|---|---|---|---|---|---|---|---|---|
2 | 1.39 | 0.393 | 0.400 | ||||||
3 | 2.08 | 0.283 | 0.237 | 0.253 | |||||
4 | 2.77 | 0.221 | 0.155 | 0.147 | 0.160 | ||||
5 | 3.46 | 0.181 | 0.109 | 0.092 | 0.092 | 0.101 | |||
6 | 4.16 | 0.154 | 0.0804 | 0.0609 | 0.0561 | 0.0578 | 0.0638 | ||
7 | 4.85 | 0.133 | 0.0618 | 0.0423 | 0.0359 | 0.0347 | 0.0364 | ||
8 | 5.55 | 0.118 | 0.0489 | 0.0306 | 0.024 | 0.0217 | 0.0216 | 0.0229 | |
9 | 6.24 | 0.105 | 0.0397 | 0.0228 | 0.0166 | 0.0141 | 0.0133 | 0.0135 | 0.0145 |
10 | 6.93 | 0.0952 | 0.0329 | 0.0174 | 0.0118 | 0.00943 | 0.00844 | 0.00819 | 0.00846 |
11 | 7.62 | 0.0869 | 0.0276 | 0.0136 | 0.00864 | 0.0065 | 0.00552 | 0.00513 | 0.00509 |
12 | 8.32 | 0.08 | 0.0236 | 0.0108 | 0.00646 | 0.00459 | 0.00371 | 0.00329 | 0.00314 |
13 | 9.01 | 0.074 | 0.0203 | 0.00875 | 0.00492 | 0.00332 | 0.00255 | 0.00217 | 0.00199 |
14 | 9.7 | 0.0689 | 0.0177 | 0.00718 | 0.00381 | 0.00244 | 0.00179 | 0.00146 | 0.00129 |
15 | 10.4 | 0.0645 | 0.0156 | 0.00596 | 0.003 | 0.00183 | 0.00128 | 0.001 | 0.000852 |
16 | 11.1 | 0.0606 | 0.0138 | 0.005 | 0.00239 | 0.00139 | 0.000935 | 0.000702 | 0.000574 |
17 | 11.8 | 0.0571 | 0.0123 | 0.00423 | 0.00193 | 0.00107 | 0.000692 | 0.000499 | 0.000394 |
18 | 12.5 | 0.054 | 0.0111 | 0.00362 | 0.00158 | 0.000839 | 0.000519 | 0.00036 | 0.000275 |
19 | 13.2 | 0.0513 | 0.00998 | 0.00312 | 0.0013 | 0.000663 | 0.000394 | 0.000264 | 0.000194 |
20 | 13.9 | 0.0488 | 0.00906 | 0.0027 | 0.00108 | 0.00053 | 0.000303 | 0.000196 | 0.00014 |
21 | 14.6 | 0.0465 | 0.00825 | 0.00236 | 0.000905 | 0.000427 | 0.000236 | 0.000147 | 0.000101 |
22 | 15.2 | 0.0444 | 0.00755 | 0.00207 | 0.000764 | 0.000347 | 0.000185 | 0.000112 | 7.46e-05 |
23 | 15.9 | 0.0425 | 0.00694 | 0.00183 | 0.000649 | 0.000285 | 0.000147 | 8.56e-05 | 5.55e-05 |
24 | 16.6 | 0.0408 | 0.00639 | 0.00162 | 0.000555 | 0.000235 | 0.000117 | 6.63e-05 | 4.17e-05 |
25 | 17.3 | 0.0392 | 0.00591 | 0.00145 | 0.000478 | 0.000196 | 9.44e-05 | 5.18e-05 | 3.16e-05 |
26 | 18 | 0.0377 | 0.00548 | 0.00129 | 0.000413 | 0.000164 | 7.66e-05 | 4.08e-05 | 2.42e-05 |
27 | 18.7 | 0.0364 | 0.0051 | 0.00116 | 0.000359 | 0.000138 | 6.26e-05 | 3.24e-05 | 1.87e-05 |
28 | 19.4 | 0.0351 | 0.00475 | 0.00105 | 0.000314 | 0.000117 | 5.15e-05 | 2.59e-05 | 1.46e-05 |
29 | 20.1 | 0.0339 | 0.00444 | 0.000949 | 0.000276 | 9.96e-05 | 4.26e-05 | 2.09e-05 | 1.14e-05 |
30 | 20.8 | 0.0328 | 0.00416 | 0.000862 | 0.000243 | 8.53e-05 | 3.55e-05 | 1.69e-05 | 9.01e-06 |
31 | 21.5 | 0.0317 | 0.0039 | 0.000785 | 0.000215 | 7.33e-05 | 2.97e-05 | 1.38e-05 | 7.16e-06 |
32 | 22.2 | 0.0308 | 0.00367 | 0.000717 | 0.000191 | 6.33e-05 | 2.5e-05 | 1.13e-05 | 5.73e-06 |
m**/**n | k | k=9 | k=10 | k=11 | k=12 | k=13 | k=14 | k=15 | k=16 |
---|---|---|---|---|---|---|---|---|---|
11 | 7.62 | 0.00531 | |||||||
12 | 8.32 | 0.00317 | 0.00334 | ||||||
13 | 9.01 | 0.00194 | 0.00198 | 0.0021 | |||||
14 | 9.7 | 0.00121 | 0.0012 | 0.00124 | |||||
15 | 10.4 | 0.000775 | 0.000744 | 0.000747 | 0.000778 | ||||
16 | 11.1 | 0.000505 | 0.00047 | 0.000459 | 0.000466 | 0.000488 | |||
17 | 11.8 | 0.000335 | 0.000302 | 0.000287 | 0.000284 | 0.000291 | |||
18 | 12.5 | 0.000226 | 0.000198 | 0.000183 | 0.000176 | 0.000176 | 0.000182 | ||
19 | 13.2 | 0.000155 | 0.000132 | 0.000118 | 0.000111 | 0.000109 | 0.00011 | 0.000114 | |
20 | 13.9 | 0.000108 | 8.89e-05 | 7.77e-05 | 7.12e-05 | 6.79e-05 | 6.71e-05 | 6.84e-05 | |
21 | 14.6 | 7.59e-05 | 6.09e-05 | 5.18e-05 | 4.63e-05 | 4.31e-05 | 4.17e-05 | 4.16e-05 | 4.27e-05 |
22 | 15.2 | 5.42e-05 | 4.23e-05 | 3.5e-05 | 3.05e-05 | 2.78e-05 | 2.63e-05 | 2.57e-05 | 2.59e-05 |
23 | 15.9 | 3.92e-05 | 2.97e-05 | 2.4e-05 | 2.04e-05 | 1.81e-05 | 1.68e-05 | 1.61e-05 | 1.59e-05 |
24 | 16.6 | 2.86e-05 | 2.11e-05 | 1.66e-05 | 1.38e-05 | 1.2e-05 | 1.08e-05 | 1.02e-05 | 9.87e-06 |
25 | 17.3 | 2.11e-05 | 1.52e-05 | 1.16e-05 | 9.42e-06 | 8.01e-06 | 7.1e-06 | 6.54e-06 | 6.22e-06 |
26 | 18 | 1.57e-05 | 1.1e-05 | 8.23e-06 | 6.52e-06 | 5.42e-06 | 4.7e-06 | 4.24e-06 | 3.96e-06 |
27 | 18.7 | 1.18e-05 | 8.07e-06 | 5.89e-06 | 4.56e-06 | 3.7e-06 | 3.15e-06 | 2.79e-06 | 2.55e-06 |
28 | 19.4 | 8.96e-06 | 5.97e-06 | 4.25e-06 | 3.22e-06 | 2.56e-06 | 2.13e-06 | 1.85e-06 | 1.66e-06 |
29 | 20.1 | 6.85e-06 | 4.45e-06 | 3.1e-06 | 2.29e-06 | 1.79e-06 | 1.46e-06 | 1.24e-06 | 1.09e-06 |
30 | 20.8 | 5.28e-06 | 3.35e-06 | 2.28e-06 | 1.65e-06 | 1.26e-06 | 1.01e-06 | 8.39e-06 | 7.26e-06 |
31 | 21.5 | 4.1e-06 | 2.54e-06 | 1.69e-06 | 1.2e-06 | 8.93e-07 | 7e-07 | 5.73e-07 | 4.87e-07 |
32 | 22.2 | 3.2e-06 | 1.94e-06 | 1.26e-06 | 8.74e-07 | 6.4e-07 | 4.92e-07 | 3.95e-07 | 3.3e-07 |
m**/**n | k | k=17 | k=18 | k=19 | k=20 | k=21 | k=22 | k=23 | k=24 |
---|---|---|---|---|---|---|---|---|---|
22 | 15.2 | 2.67e-05 | |||||||
23 | 15.9 | 1.61e-05 | |||||||
24 | 16.6 | 9.84e-06 | 1e-05 | ||||||
25 | 17.3 | 6.08e-06 | 6.11e-06 | 6.27e-06 | |||||
26 | 18 | 3.81e-06 | 3.76e-06 | 3.8e-06 | 3.92e-06 | ||||
27 | 18.7 | 2.41e-06 | 2.34e-06 | 2.33e-06 | 2.37e-06 | ||||
28 | 19.4 | 1.54e-06 | 1.47e-06 | 1.44e-06 | 1.44e-06 | 1.48e-06 | |||
29 | 20.1 | 9.96e-07 | 9.35e-07 | 9.01e-07 | 8.89e-07 | 8.96e-07 | 9.21e-07 | ||
30 | 20.8 | 6.5e-07 | 6e-07 | 5.69e-07 | 5.54e-07 | 5.5e-07 | 5.58e-07 | ||
31 | 21.5 | 4.29e-07 | 3.89e-07 | 3.63e-07 | 3.48e-07 | 3.41e-07 | 3.41e-07 | 3.48e-07 | |
32 | 22.2 | 2.85e-07 | 2.55e-07 | 2.34e-07 | 2.21e-07 | 2.13e-07 | 2.1e-07 | 2.12e-07 | 2.17e-07 |
四、参考
【0】数学之美 (第三版)
原文链接: https://www.delta1037.cn/2020/Math/布隆过滤器/
版权声明: 转载请注明出处.