我尝试过使用bloom过滤器来执行成员资格测试。我希望对800亿个条目进行成员资格测试,只允许发生大约100次碰撞,即只有100个条目可以给出误报结果。
我知道这可以通过布隆过滤器来实现,但是使用确定每个条目所需的位数的公式和给定允许的误报率的散列函数的数量。我想我最终会使用270 GB的内存和19个哈希函数。
我还看了一下Cuckoo过滤器,但它的内存要求与我的要求不符。我的要求如下:
有人可以建议我一个概率数据结构,而不是上面提到的那个可以帮助我实现我的要求吗?
答案 0 :(得分:1)
散列函数的数量问题并不是真正的问题 - 只需选择具有多位输出的单个散列函数,并将这些位分开,就像它们来自单独的散列函数一样。这里真正的问题是与存储空间的误报率折衷。
你说过
我希望仅对800亿条目进行会员资格测试 允许发生大约100次碰撞,即只有100个条目可以发生 给出假阳性结果。
根据定义,地图中的条目不能是 false 正数。他们真实积极。
接下来的问题是“对于有多少条目采取了100个误报 你打算测试吗?“如果答案也是,奇怪的是,800亿,那么你要求的假阳性率约为100 / 80,000,000,000 = 1/800,000,000,小于2 ^ -29。
Bloom过滤器或布谷鸟过滤器等任何近似成员资格数据结构的最小空间为n lg 1 /ε比特,其中n是结构中元素的数量,lg是对数基数2,ε是误报率。换句话说,每个元素需要超过29位才能实现误报率,如每800亿个100。每个元素6位将获得1.56%的误报率最多。这是每800亿的12.5亿,或每6400 100。
据我所知,没有已知的实用数据结构接近实现这一目标。例如,布隆过滤器不会因为每个项目使用超过lg 1 /ε位。 Cuckoo过滤器不会,因为它们每个项目至少使用两个额外的元数据位,并且每个项目的比特率可以与lg n一起扩展。