布隆过滤器概念及其公式推导


公式推导内容转自博客 https://blog.csdn.net/houzuoxin/article/details/20907911

布隆过滤器概念

数据如何存入布隆过滤器

布隆过滤器是由一个很长的二进制矢量和一系列哈希函数组成的。
二进制矢量本质是一个位数组:数组的每个元素都只占1bit空间,并且每个元素只能为0或1。
布隆过滤器还拥有k个哈希函数,当一个元素加入布隆过滤器中的时候,会使用k个哈希函数对其进行k次计算,得到k个哈希值,并且根据得到的哈希值,在维数组中把对应下标的值置位1。
若要判断这个数是否在布隆过滤器中,就对该元素进行k次哈希计算,得到的值在位数组中判断每个元素是否都为1,如果每个元素都为1,就说明这个值在布隆过滤器中。

误判情况

布隆过滤器只能插入不能删除,所以插入的元素越来越多时,当一个不在布隆过滤器中的元素,经过同样规则的哈希计算之后,得到的值在位数组中查询,有可能这些位置因为其他的元素先被置1了。所以布隆过滤器存在误判的情况,但是如果布隆过滤器判断某个元素不在布隆过滤器中,那么这个值就一定不在。
如何补救这个情况呢,可以设立白名单,存储可能会被误判的元素。

综上所述,布隆过滤器可精确的代表一个集合,可精确判断某一元素是否在此集合中,精确程度由用户的具体设计决定,达到100%的正确是不可能的。但是布隆过滤器的优势在于,利用很少的空间可以达到较高的精确率。

实际应用面试题

不安全网页的黑名单包含100亿个黑名单网页,每个网页的URL

### 布隆过滤器公式推导过程及原理 布隆过滤器是一种高效的数据结构,主要用于测试某个元素是否属于一个集合。其核心思想是通过多个哈希函数将元素映射到一个位数组中,并利用这些位置来表示该元素的存在状态。 #### 1. 错误率的定义 当查询一个不在集合中的元素时,可能会因为某些哈希冲突而返回错误的结果(即假阳性)。这种现象的概率称为 **误判概率** 或者 **错误率** \( P \)[^2]。目标是在给定存储空间的情况下最小化这个错误率。 假设我们有以下变量: - \( m \): 表示布隆过滤器使用的比特数; - \( n \): 需要插入的元素数量; - \( k \): 使用的独立哈希函数的数量; - \( p \): 要求的最大允许错误率。 #### 2. 单个比特被置为1的概率 对于任意一位,在某次哈希操作后未被设置为1的概率为: \[ (1 - \frac{1}{m}) \] 如果进行了\( kn \)次哈希操作,则这一位仍未被设置为1的概率变为: \[ (1 - \frac{1}{m})^{kn} \] 因此,这一位至少有一次被设为1的概率为: \[ 1 - (1 - \frac{1}{m})^{kn} \approx 1 - e^{-kn/m} \quad (\text{大数近似})[^4] \] #### 3. 查询不存在元素时发生误报的概率 当我们查询一个不属于集合的元素时,只有当所有的\( k \)个哈希函数对应的位都被设置为1才会发生误报。由于每个位被设置为1的概率相互独立,所以总的误报率为: \[ p = (1 - e^{-kn/m})^k [^4] \] 为了简化分析,我们可以进一步优化此表达式。令 \( x = \frac{n}{m} \),则上述公式可重写为: \[ p = (1 - e^{-kx})^k \] #### 4. 最优哈希函数数量的选择 为了让错误率达到最低,我们需要找到最优的哈希函数数量 \( k \)。通过对上面的公式取偏导并使其等于零,可以得出最佳的 \( k \): \[ k = \ln(2) \cdot \frac{m}{n} \approx 0.693 \cdot \frac{m}{n}[^4] \] 此时,相应的错误率 \( p \) 可以达到理论上的最小值: \[ p_{min} = (0.5)^{\ln(2)} \cdot \left(\frac{m}{n}\right)^\ln(2) \approx 0.6185^{\frac{m}{n}} [^4] \] 这表明随着分配的空间增大或者待插入元素减少,错误率会显著降低。 #### 5. 存储需求计算 根据前面提到的最佳配置条件,还可以估算所需的最少存储空间 \( m \) 来满足特定的目标错误率 \( p \) 和预计插入数目 \( n \) : \[ m = -\frac{n \ln(p)}{(\ln(2))^2} [^4] \] 同样地,基于同样的设定下推荐采用多少个不同的散列函数也可以直接给出: \[ k = \max(1, \lceil-\log_2(p)\rceil ) [^4] \] 以上就是关于布隆过滤器基本工作机理以及相关重要参数之间关系的具体数学描述与论证过程。 ```python import math def optimal_bloom_parameters(n, desired_fp_rate): """ 计算布隆过滤器所需的最佳参数。 参数: n : int 插入元素总数 desired_fp_rate : float 所需最大错误率 返回: Tuple[int, int] (需要的bit数m, hash函数个数k) """ m = math.ceil(-n * math.log(desired_fp_rate) / (math.log(2)**2)) k = round((m/n)*math.log(2)) return m, max(k, 1) # 示例调用 print(optimal_bloom_parameters(1000, 0.01)) # 输出适合处理千级别数据且FP Rate=1% 的bloom filter尺寸 ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值