【问题标题】:Computing the approximate population of a bloom filter计算布隆过滤器的近似种群
【发布时间】:2012-02-24 13:48:34
【问题描述】:
给定一个大小为 N 位的布隆过滤器和 K 个哈希函数,其中设置了过滤器的 M 位(其中 M
是否可以估计插入布隆过滤器的元素数量?
简单示例
我一直在考虑下面的例子,假设一个 100 位的 BF 和 5 个设置为 10 位的散列函数......
最好的情况:假设散列函数真的很完美,并且为一些 X 数量的值唯一地映射一个位,那么给定 10 位已经设置,我们可以说只有 2 个元素插入到 BF 中
最坏的情况:假设哈希函数不好并且始终映射到同一个位(但彼此之间是唯一的),那么我们可以说 BF 中插入了 10 个元素
范围似乎是 [2,10],其中大约在这个范围内可能是由过滤器的误报概率决定的 - 我被困在这一点上。
【问题讨论】:
标签:
c++
algorithm
probability
bloom-filter
computation
【解决方案1】:
这个问题让我有点担心,因为有better algorithms 用于近似计算具有少量存储的不同元素的数量。
尽管如此,如果我们必须使用布隆过滤器,让我们假设散列函数是随机预言(所有值都是独立选择的,或者“非常完美”,不要与完美散列混淆)。现在我们有一个球和箱子的问题:假设M 的N 箱子里有球,我们扔了多少球?设B 为投出的球数;项目的数量是B/K,因为对于每个项目,我们都会扔K 球。
balls 和 bins 过程的标准近似是将每个 bin 建模为一个独立的 Poisson 过程;垃圾箱被占用之前的时间呈指数分布。假设1 是投掷所有球所需的时间,则该指数分布速率的最大似然估计λ 满足Pr(Exponential[λ] < 1) = M/N,因此1 - exp(-λ) = M/N 和λ = -log(1 - M/N)。参数λ类似于球的数量,所以估计的项目数量是B ≈ -N log(1 - M/N)/K。
编辑:有N bins,所以我们需要乘以N。
【解决方案2】:
Wikipedia 处的条目为您提供了任何特定位被设置的概率的公式,假设散列函数使一切随机。这是1 - (1-1/m)^kn。由于过滤器中有m 位,这意味着设置的预期/平均位数将为m(1-(1-1/m)^kn)。因此,您可以通过选择n 来对n 做出合理合理的猜测,使其等于实际设置的位数。
要了解这种猜测可能有多准确,最好了解所设置的位数的方差。你可以准确地解决这个问题,但这有点让人头疼。您可以使用Var(X) = E(X^2) - E(X)^2 的事实。在这种情况下,E(X^2) 主要取决于位对都将被设置的概率,您可以通过考虑诸如“位0 已设置且位1 已明确且所有其他位均已清除”和“0 位已清除”和“除0 和1 之外的所有位均已清除”。