目录

BloomFilter中的数学推导

mm: 表示 Bloom Filter bit array 的长度;
kk: 表示 hash 函数个数;
nn: 表示插入元素的个数;

假设 hash 函数以等概率选择 bit array 的下标,那么某次 hash 后,某个特定 bit 位未被设置为 1 的概率为 11m1 - \frac{1}{m}。经过 kk 个 hash 函数之后,该 bit 位仍未被设置为 1 的概率为:

(11m)k \left(1 - \frac{1}{m}\right)^k

在插入 nn 个元素之后,某个 bit 位仍然没有被设置为 1 的概率为:

(11m)kn \left(1 - \frac{1}{m}\right)^{kn}

因此在插入 nn 个元素之后,某个 bit 位被设置为 1 的概率为:

p=1(11m)kn p = 1 - \left(1 - \frac{1}{m}\right)^{kn}

对于一个不存在于集合中的元素,如果要出现误判(false positive),意味着经过 kk 个 hash 函数之后,生成的 kk 个下标所对应的 bit 位全部为 1,其概率为:

ε=pk=(1(11m)kn)k \varepsilon = p^k = \left(1 - \left(1 - \frac{1}{m}\right)^{kn}\right)^k

接下来利用自然常数 ee 的极限定义对上式进行简化。已知:

limm(1+zm)m=ez \lim_{m \to \infty}\left(1 + \frac{z}{m}\right)^m = e^z

z=1z = -1:

limm(11m)m=e1 \lim_{m \to \infty}\left(1 - \frac{1}{m}\right)^m = e^{-1}

mm 足够大时,有:

(11m)kn=((11m)m)knmeknm \left(1 - \frac{1}{m}\right)^{kn} = \left(\left(1 - \frac{1}{m}\right)^m\right)^{\frac{kn}{m}} \approx e^{-\frac{kn}{m}}

代入 ε\varepsilon 可得:

ε(1eknm)k \varepsilon \approx \left(1 - e^{-\frac{kn}{m}}\right)^k

ε\varepsilon 最小时,kk 为最优。因此需要对 ε\varepsilon 关于 kk 求导,找到极小值点。

f=(1eknm)kf = \left(1 - e^{-\frac{kn}{m}}\right)^k,对等式两边取对数:

g=lnf=kln(1eknm) g = \ln f = k \cdot \ln\left(1 - e^{-\frac{kn}{m}}\right)

gg 关于 kk 求导(利用乘积法则):

dgdk=ln(1eknm)+kddkln(1eknm) \frac{dg}{dk} = \ln\left(1 - e^{-\frac{kn}{m}}\right) + k \cdot \frac{d}{dk}\ln\left(1 - e^{-\frac{kn}{m}}\right)

对第二项应用链式法则:

ddkln(1eknm)=nmeknm1eknm \frac{d}{dk}\ln\left(1 - e^{-\frac{kn}{m}}\right) = \frac{\frac{n}{m} \cdot e^{-\frac{kn}{m}}}{1 - e^{-\frac{kn}{m}}}

因此:

dgdk=ln(1eknm)+knmeknm1eknm \frac{dg}{dk} = \ln\left(1 - e^{-\frac{kn}{m}}\right) + \frac{kn}{m} \cdot \frac{e^{-\frac{kn}{m}}}{1 - e^{-\frac{kn}{m}}}

dgdk=0\frac{dg}{dk} = 0(在不考虑 kk 为整数的约束下寻找极值点):

ln(1eknm)+knmeknm1eknm=0 \ln\left(1 - e^{-\frac{kn}{m}}\right) + \frac{kn}{m} \cdot \frac{e^{-\frac{kn}{m}}}{1 - e^{-\frac{kn}{m}}} = 0

整理得:

ln(1eknm)=knmeknm1eknm -\ln\left(1 - e^{-\frac{kn}{m}}\right) = \frac{kn}{m} \cdot \frac{e^{-\frac{kn}{m}}}{1 - e^{-\frac{kn}{m}}}

对等式两边取指数:

11eknm=eknmeknm1eknm \frac{1}{1 - e^{-\frac{kn}{m}}} = e^{\frac{kn}{m} \cdot \frac{e^{-\frac{kn}{m}}}{1 - e^{-\frac{kn}{m}}}}

为简化表达,令 x=eknmx = e^{-\frac{kn}{m}}(其中 0<x<10 < x < 1),可得:

11x=(1x)x1x \frac{1}{1 - x} = \left(\frac{1}{x}\right)^{\frac{x}{1 - x}}     (1x)1=xx1x    (1x)=xx1x \iff (1 - x)^{-1} = x^{-\frac{x}{1-x}} \iff (1 - x) = x^{\frac{x}{1 - x}}

对等式两边取对数:

ln(1x)=x1xlnx \ln(1 - x) = \frac{x}{1 - x} \cdot \ln x     (1x)ln(1x)=xlnx \iff (1 - x) \cdot \ln(1 - x) = x \cdot \ln x

h(t)=tlnth(t) = t \cdot \ln t,上式即 h(1x)=h(x)h(1 - x) = h(x)。由于 h(t)h(t)(0,1)(0, 1) 上先递减后递增,且关于 t=12t = \frac{1}{2} 对称(即 h(t)=h(1t)h(t) = h(1-t) 当且仅当 t=12t = \frac{1}{2}),可得 x=12x = \frac{1}{2}

又因为 x=eknmx = e^{-\frac{kn}{m}},所以:

eknm=12    knm=ln12=ln2    k=mnln2 e^{-\frac{kn}{m}} = \frac{1}{2} \iff -\frac{kn}{m} = \ln\frac{1}{2} = -\ln 2 \iff k = \frac{m}{n} \ln 2

已知 ε(1eknm)k\varepsilon \approx \left(1 - e^{-\frac{kn}{m}}\right)^k,将 k=mnln2k = \frac{m}{n}\ln 2 代入。

由前面的推导,当 kk 取最优值时 eknm=12e^{-\frac{kn}{m}} = \frac{1}{2},因此:

ε(112)mnln2=(12)mnln2 \varepsilon \approx \left(1 - \frac{1}{2}\right)^{\frac{m}{n}\ln 2} = \left(\frac{1}{2}\right)^{\frac{m}{n}\ln 2}

对两边取自然对数:

lnεmnln2ln12=mn(ln2)2 \ln \varepsilon \approx \frac{m}{n} \ln 2 \cdot \ln\frac{1}{2} = -\frac{m}{n} (\ln 2)^2

解出 mm:

mnlnε(ln2)21.44nlog2ε m \approx -\frac{n \ln \varepsilon}{(\ln 2)^2} \approx -1.44 \, n \log_2 \varepsilon

其中 1(ln2)22.08\frac{1}{(\ln 2)^2} \approx 2.08,所以也可以写成 m2.08nlnεm \approx -2.08 \, n \ln \varepsilon

给定预期插入元素数 nn 和可接受的误判率 ε\varepsilon:

  • 最优 bit array 长度: mnlnε(ln2)2m \approx -\frac{n \ln \varepsilon}{(\ln 2)^2}
  • 最优 hash 函数个数: k=mnln2log2εk = \frac{m}{n} \ln 2 \approx -\log_2 \varepsilon

例如,若期望误判率为 1%(ε=0.01\varepsilon = 0.01),则每个元素约需 9.6 bits,最优 hash 函数个数约为 7。