1. 如何为给定元素数 n 与可接受假阳率 p 计算所需位数组大小 m=-n·lnp/(ln2)² 与哈希数 k=(m/n)·ln2
给定元素数 n 与可接受假阳率 p,如何计算位数组大小 m=-n·lnp/(ln2)² 与哈希数 k=(m/n)·ln2?计算流程与验算如何做?
- 公式的来源与最优性条件
- 取整与字节对齐的工程处理
- 双哈希派生的实现技巧
给定 n、p:m=-n·ln p/(ln 2)²(向上取整),k=(m/n)·ln 2(取整)。推导:假阳率 p=(1-e^{-kn/m})^k,令最优 k=(m/n)·ln 2 得 p=(1/2)^k → k=-log2 p,回代 m=kn/ln 2 = -n·ln p/(ln 2)²。例:n=10^6、p=0.01 → k≈6.64 取 7,m≈9.58×10^6 位≈1.2MB;验算 p_actual=(1-e^{-7×9.58e6/1e6})^7 的精确值约 0.8%-1.1%,接近目标。
工程注意:k 取整后实际假阳率略高于理论最优,可把 m 上调 10% 补偿;哈希函数用双哈希派生(h1(x)+i·h2(x),i=1..k)替代 k 个独立哈希以省计算;m 对齐缓存行与字节边界提升访问效率。
反推公式的锚点是"p=(1/2)^k 最优关系";先定 k=-log2 p 再定 m=kn/ln 2 比硬背公式更不容易错,面试按这个顺序推导即可。