我正在尝试使用Bloom过滤器来确定集合家族中的哪些集合A1
,A2
,...,Am
是另一个固定集合的子集Q
。我希望有人能够验证所述方法的正确性或提供任何改进。用于确定家族中的哪些集合是给定集合的子集的Bloom过滤器
让Q
为给定的整数集合,其中包含来自宇宙集合中的1-10000个元素的任何地方集合U = {1,2,...,10000}
。
此外,让有套A1
,A2
,一个家庭...,Am
每个从相同宇宙1-3元件的任何位置含有设置U
。大小m
是5000
轮廓算法的顺序:
要有的k
哈希函数的集合。对于Q
的每个元素,应用散列函数并将其添加到大小为n
的位集,表示为Q_b
。
此外,对于每个Ai
,i = 1,...,m
套,应用散列函数到的Ai
每个元素,生成位集(也的大小n
),表示为Ai_b
。
要检查是否Ai
是Q
的子集,执行逻辑与上两个bitset,Q_b & Ai_b
,并检查是否是等于位集Ai_b
。也就是说,如果Q_b & Ai_b == Ai_b
为假,那么我们知道Ai
不是Q
的子集;如果它是真的,那么我们不知道(误报的可能性),我们需要使用确定性方法检查给定的Ai
。
希望是过滤器告诉我们大多数Ai
的不在Q
中,我们可以更仔细地检查那些返回true的东西。
这是一个很好的方法来解决我的问题吗?
(边问题:?n
应该有多大有什么好的哈希函数使用?)
感谢您的评论。对于我的问题,通常情况下,只有少数几个'Ai'实际上处于'Q'(大约10-30),这会使布隆过滤器更令人满意,还是会使用您描述的确定性方法以上仍然表现更好? – jonem
@jobnem如果确定性方法没有问题,我仍然会使用它。它还有另一个好处:它很简单。 – kraskevich