【问题标题】:Consequences of positive matches in Bloom filters布隆过滤器中正匹配的后果
【发布时间】:2023-03-17 13:19:01
【问题描述】:
假设:
- 注册用户的用户名存储在一个集合中
- 我想使用布隆过滤器加快查找速度。
- 布隆过滤器作为一定概率的误报 (0.1%)
当一个新用户想要注册时,在大多数情况下,我的 UI 会告诉他们“这个名字没有被使用,你可以去”。
但是如果找到正匹配,后端需要做什么?
结果可能是误报。找出真正的答案不会增加时间复杂度,从而在许多情况下使布隆过滤器效率低下吗?
告诉用户“名称在使用中,选择不同的 oe”可能并没有那么糟糕,但其他不会错的用例呢。
【问题讨论】:
标签:
performance
data-structures
bloom-filter
【解决方案1】:
使用布隆过滤器的一般模型如下:
- 查询过滤器以查看答案是否可能是肯定的。
- 如果布隆过滤器说不,答案肯定是不。
- 如果 Bloom 过滤器说是,那么答案可能是肯定的,因此请查询更准确的数据结构以获得最终确定。
当步骤 (3) 的形式是“查询某处的某个服务器以搜索一个巨大的数据库以查看您是否有问题的项目”时,布隆过滤器真的会大放异彩。在这种情况下,减少服务器需要被 ping 的次数才能做出决定可以极大地提高客户端的性能并减少服务器上的负载。
另一方面,如果您要在机器上本地存储一个小数据集,那么 Bloom 过滤器就不太可能完成所有工作,因为直接查询该数据集可能对所有人来说都足够快你的需求。
【解决方案2】:
Bloomfilter 仅在您想要检测传入的单词是否已存在于我们的数据库中时使用。
作为特定的bloomfilter输出
- 是的 - 这意味着我们的数据库中可能存在也可能不存在单词
- 不,这意味着 100% 确定该词不存在
此外,误报不应该对您的情况造成伤害,但如果您真的很担心,bloomfilters 的错误率由以下公式给出:
错误率 = [1-(1-(1/m))^(k*i)]^k
其中 i 是当前插入的数量,i。 e.如果您在布隆过滤器中插入第 20 个单词,则 i=20
k 是散列函数的数量
m 是位数组的大小
因此您可以继续并最小化它以满足您的需要。
此外,使用的哈希函数的最佳数量由
给出
k=(m/n)log 2
其中 n 是要插入的单词总数。所以你可以相应地选择散列函数的数量。