计算布隆过滤器的近似人口


12

给定大小为N位和K个哈希函数的Bloom过滤器,其中设置了过滤器的M位(其中M <= N)。

是否可以估计插入到布隆过滤器中的元素数量?

简单的例子

我一直在考虑以下示例,假设BF为100位,并设置了5个散列函数,其中设置了10位...

最佳情况:假设哈希函数确实是完美的,并且为X个值的值唯一地映射了一点,那么在设置了10位的情况下,我们可以说仅在BF中插入了2个元素

最坏的情况:假设哈希函数很差,并且始终映射到同一位(彼此之间是唯一的),那么可以说,BF中已插入10个元素

范围似乎是[2,10],此范围内的大约可能由过滤器的假阳性概率确定-在这一点上,我陷入了困境。


4
为什么不对插入的元素数量保持计数?如果插入了n个元素,则只需要额外的位。O(logn)n
2012年

@Joe,虽然那是个好主意,但确实确实破坏了一个非常有趣的问题。
dan_waterworth 2012年

只是注意重复项,Joe的方法会有一些小错误,因为我们无法始终确定添加元素时元素是否已经存在(因此我们应该增加计数或不增加计数)。
usul 2015年

Answers:


5

是。从维基百科

如果使用k个哈希函数将元素插入大小为n的过滤器中,则某个位仍为0的概率为ink

z=(11n)ki

您可以这种可能性衡量为过滤器中0位的比例。求解i

i=ln(z)kln(11n)

我已经在实践中使用了此方法,只要您的过滤器不超过其容量,对于数百万个位的过滤器,误差通常小于0.1%。当滤波器超出其容量时,误差当然会上升。


3

如果假设对于每个对象的每个哈希函数,均一地随机设置一个位,并且对已设置的位数进行计数,则应该能够限制插入的对象数为在一定范围内,可能使用球和桶的配方。每一位都是一个bin,如果其中至少有1个球,则进行设置,插入的每个对象抛出球,其中k是哈希函数的数量,n k是插入n个对象之后抛出的球的数量。假设b个垃圾桶中至少有1个球,那么至少要扔t个球的概率是多少?我认为在这里您可以使用以下事实: kknknbt ,但与该制剂中的问题是,我没有看到一个简单的方法来计算 P P b ,但是找到使该概率最大化的 t的值并不难。

P(t balls|b bins)=P(b bins|t balls)P(t)/P(b)
P(t)P(b)t

2

有趣的问题,让我们看一些具体情况。

要有键,Ñ ö Ñ上位,Ñ ö 一个位在总的和插入元件。我们首先尝试找到一个函数P k n o nn t o t a lm ,它是状态发生的概率。knonntotalmP(k,non,ntotal,m)

km<nonP(k,non,ntotal,m)0

non=1kmkm1

P(k,1,ntotal,m)=(1/ntotal)(km1)

non=2km21ntotal(ntotal1)2(2/ntotal)km2

ntotal(ntotal1)(2/ntotal)km

12

P(k,2,ntotal,m)=ntotal(ntotal1)(2/ntotal)km(1/ntotal)(km1)

我认为我们现在可以对此进行概括。

P(k,non,ntotal,m)=(ntotalnon)(non/ntotal)kmi=1i<nonP(k,i,ntotal,m)

我不确定如何使该公式更适合计算。天真地实现它会导致指数时间的执行时间,尽管通过记忆实现线性时间是微不足道的。然后,这只是找到最可能的。我的直觉是,只有一个峰,因此有可能很快找到它,但是天真的,您肯定可以在找到最可能的m 。mO(n2)


我认为您的公式抵消了(忽略恒定因素)。您可以通过分析计算出最大值:展开第二项的第一个因子,并去除常数因子以消除所有,那么您的公式将变得非常简单。(ntotalnon)nonkm(ntotalnon1)(non1)kmn choose k
Jules

@Jules,太好了,我确定会发生类似的事情,但是没有时间弄清楚它。
dan_waterworth 2012年

您还可以通过以下方式直接得出该公式:。然后,在插件为。P(non=x)=P(nonx)P(non<x)=P(nonx)P(nonx1)(ntotalx)(x/ntotal)kmP(nonx)
Jules

2

假设哈希是均匀分布的。

让为插入的哈希数。因为我们有哈希到 bin中,如果我们有哈希到 bin中,并且下一个哈希进入 bin中的个中的一个,或者如果我们有哈希到 bin中,则下一个哈希进入放入其他容器中的一个,我们有:iimi1mmni1m1n(m1)

P(m,i)=P(m,i1)(m/n)+P(m1,i1)(n(m1))/n

改写:

P(m,i)=1n(mP(m,i1)+(nm+1)P(m1,i1))

当时我们也有且, 而当时,。这给你的,用于计算P.计算动态规划算法最大化为您提供了最大似然估计。P(0,0)=1P(m,0)=0m0P(0,i)=0i0O(mi)iP(m,i)

如果我们知道我们已经对该哈希过滤器哈希了次,并且每个项目有散列,则项目数为。iki/k

为了加快速度,您可以做一些事情。可以忽略的因数,因为它不会改变最大值的位置。您可以通过多次调用共享动态编程表,以将(渐近)运行时间减少到。如果您愿意相信有一个最大值,则可以尽早停止的迭代,并获得运行时间,其中是达到最大值的点,甚至可以执行二进制搜索得到。 PmiOnmiOjmjPOmlogn1nP(m,i)O(nm)iO(jm)jPO(mlogn)


2

关键思想是近似零位数的期望。

对于每个位,在使用K个哈希函数进行t次插入后可能为零:。(11N)KteKtN

那么零位数的期望应该是:

NMNeKtN由观测值近似NM

最后我们得到t=NKln(1MN)


1

在n次插入后特定位为1的概率为:P = 1-(1-1 / m)^(kn)

令X_i为离散随机变量,如果第i个位置的位为1,则为1,否则为0。令X = X_1 + X_2 + .... + X_m。然后,E [X] = m *P。

如果置位的总数为S,则:E [X] = S,这意味着m * P =S。这可以解决n个问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.