布隆过滤器的错误率推导

设 Hash 函数个数: $k$ , 布隆过滤器大小: $n$ ( $n \gg k$ ),$S$ 流上的元素个数为: $|S|$

可得 Hash 函数 $h_i$ 应用于元素 $x$ 后,布隆过滤器上某位 $B[j]$ 是 1 的概率:

$$
P(h_i [x] = 1) = \frac{1}{n}
$$

易得, $B[j]$ 是 0 的概率:

$$
P(h_i [x] = 0) = 1 - \frac{1}{n}
$$

当所有 Hash 函数应用于元素 $x$ , $B$ 依旧是 0 的概率:

$$
Pr(h_i[x] = 0, i \in [1,k]) = (1 - \frac{1}{n})^k
$$

当向布隆过滤器添加了 $S$ 流上的 $|S|$ 个元素后, $B[j]$ 为 0 的概率为:

$$
Pr(B[j] = 0) = (1 - \frac{1}{n})^{k|s|}
$$

可推得,$B[j]$ 为 1 的概率为:

$$
Pr(B[j] = 1) = 1 - (1 - \frac{1}{n})^{k|s|}
$$

结合:

$$
\lim_{n \to \infty} (1 - \frac{1}{n})^n = \frac{1}{e}
$$

可得到:

$$
\lim_{n \to \infty} (1 - \frac{1}{n})^{k|s|} = (1 - \frac{1}{n})^{\frac{nk|s|}{n}} = \frac{1}{e}^{\frac{k|s|}{n}}
$$

故 $Pr(B[j] = 1)$ 有近似值:

$$
Pr(B[j] = 1) \approx 1 - e^{-\frac{k|s|}{n}}
$$

因此误报的可能性为:

$$
P_{false} = (Pr(B[j] = 1))^k \approx (1 -e^{-\frac{k|s|}{n}})^k
$$

寻找函数个数的最优值

根据:

$$
P_{false} = (Pr(B[j] = 1))^k \approx (1 -e^{-\frac{k|S|}{n}})^k
$$

令 $x = e^{-\frac{|S|}{n}}$,可知:

$$
P_{false} = (1-x^k) ^k
$$

令 $f(x) = P_{false}$,有:

$$
f(x) = (1-x^k) ^k
$$

若存在 $g(x) = ln(f(x))$, 则 $g(x)$ 的导数为:

$$
g’(x) = [ln((1-x^k)^k)]’
$$

求解得:

$$
g’(x) = ln(1-x^k) + (1-x^k)’ \cdot \frac{1}{1-x^k} \cdot k = ln(1-x^k) - \frac{x^k \cdot ln(x^k)}{1-x^k}
$$

同时,由于:

$$
g’(x) = \frac{f’(x)}{f(x)}
$$

由 $x = e^{-\frac{|S|}{n}}$ 可证 $f(x) > 0$, 因此,当 $f’(x) = 0$ 时,存在:

$$
ln(1-x^k) - \frac{x^k \cdot ln(x^k)}{1-x^k} = 0
$$

化简得

$$
(1-x^k)ln(1-x^k) = x^kln(x^k)
$$

当且仅当 $1-x^k = x^k$ 时,上式成立,因此可知:

$$
x^k = \frac{1}{2}
$$

由于 $x = e^{-\frac{|S|}{n}}$, 因此:

$$
e^{-\frac{k|S|}{n}} = \frac{1}{2}
$$

可得:

$$
k_{opt} = \frac{nln(2)}{|S|}
$$

此时误报概率 $P_{false}$ 为:

$$
P_{false} \approx (1-\frac{1}{2})^{\frac{n}{|S|}ln(2)} = 0.6185 ^ {\frac{n}{|S|}}
$$