我正在尝试使用Bloom过滤器来确定一组A1
,A2
,...,Am
中的哪些集合是另一个固定集{{1}的子集}}。我希望有人能够验证所述方法的正确性或提供任何改进。
让Q
成为一组给定的整数,包含来自Universe集{1}的1-10000个元素。
此外,还有一系列集Q
,U = {1,2,...,10000}
,...,A1
,每个集合包含来自同一Universe集{1-3}的1-3个元素}。大小A2
大约为5000。
算法概要:
让我们有一组Am
哈希函数。对于U
的每个元素,应用哈希函数并将其添加到大小为m
的位集中,表示为k
。
此外,对于每个Q
,n
集合,将散列函数应用于Q_b
的每个元素,生成位集(也是大小为Ai
),用i = 1,...,m
表示。
要检查Ai
是n
的子集,请对两个位集Ai_b
执行逻辑AND,并检查它是否等于位集Ai
。也就是说,如果Q
为false,则我们知道Q_b & Ai_b
不是Ai_b
的子集;如果是真的,那么我们不确定(误报的可能性),我们需要使用确定性方法检查给定的Q_b & Ai_b == Ai_b
。
希望过滤器告诉我们大多数Ai
不在Q
中,我们可以更仔细地检查返回true的那些。
这是解决我问题的好方法吗?
(旁边的问题:Ai
应该有多大?有什么好的哈希函数可供使用?)
答案 0 :(得分:1)
请尝试在您的问题中只询问一个问题。
我将解决第一个问题:"这对我的问题是一个好方法吗?",但不是最后两个,"应该有多大?有什么好的哈希函数可供使用?"
这可能不是一个好方法。
首先,Q
很小;来自{1,...,10k}
的10,000个元素意味着Q
可以使用10k位或大约1.2kibibytes的位集存储。这非常非常小。例如,它比你的问题小,它使用了近1.5千比特。
其次,Ai
包含一到三个元素,因此Ai_b
可能会大于Ai
,除非您选择它们太小以至于误报率非常高。< / p>
最后,哈希函数计算不是免费的。
如果您针对代表Ai
的位集检查每个Q
的每个元素,则可以更简单地执行此操作。
答案 1 :(得分:1)
如果值的范围相当小(如示例所示),则可以使用具有线性时间复杂度的简单确定性解决方案。
让我们创建一个数组was
(索引从1到10000,即通用集的每个元素都有一个单元格),最初填充false
个值
对于q
的每个元素Q
,我们设置was[q] = true
。
现在我们遍历所有家庭集。对于每个集A_i
,我们迭代集合的所有元素x
并检查was[x]
是否为真。如果不是至少有一个x
,则A_i
不是Q
的子集。否则就是。
这个解决方案显然是正确的,因为它根据定义检查一个集合是否是另一个集合的子集。它也相当简单和确定。唯一潜在的缺点是它需要一个10000个元素的辅助数组,但它看起来可以用于大多数实际目的(无论如何,布隆过滤器也需要一些额外的空间)。