用于确定族中哪些集是给定集的子集的布隆过滤器

时间:2016-11-20 07:53:32

标签: algorithm hash bloom-filter

我正在尝试使用Bloom过滤器来确定一组A1A2,...,Am中的哪些集合是另一个固定集{{1}的子集}}。我希望有人能够验证所述方法的正确性或提供任何改进。

Q成为一组给定的整数,包含来自Universe集{1}的1-10000个元素。

此外,还有一系列集QU = {1,2,...,10000},...,A1,每个集合包含来自同一Universe集{1-3}的1-3个元素}。大小A2大约为5000。

算法概要:

让我们有一组Am哈希函数。对于U的每个元素,应用哈希函数并将其添加到大小为m的位集中,表示为k

此外,对于每个Qn集合,将散列函数应用于Q_b的每个元素,生成位集(也是大小为Ai),用i = 1,...,m表示。

要检查Ain的子集,请对两个位集Ai_b执行逻辑AND,并检查它是否等于位集Ai 。也就是说,如果Q为false,则我们知道Q_b & Ai_b不是Ai_b的子集;如果是真的,那么我们不确定(误报的可能性),我们需要使用确定性方法检查给定的Q_b & Ai_b == Ai_b

希望过滤器告诉我们大多数Ai不在Q中,我们可以更仔细地检查返回true的那些。

这是解决我问题的好方法吗?

(旁边的问题:Ai应该有多大?有什么好的哈希函数可供使用?)

2 个答案:

答案 0 :(得分:1)

请尝试在您的问题中只询问一个问题。

我将解决第一个问题:"这对我的问题是一个好方法吗?",但不是最后两个,"应该有多大?有什么好的哈希函数可供使用?"

这可能不是一个好方法。

首先,Q很小;来自{1,...,10k}的10,000个元素意味着Q可以使用10k位或大约1.2kibibytes的位集存储。这非常非常小。例如,它比你的问题小,它使用了近1.5千比特。

其次,Ai包含一到三个元素,因此Ai_b可能会大于Ai,除非您选择它们​​太小以至于误报率非常高。< / p>

最后,哈希函数计算不是免费的。

如果您针对代表Ai的位集检查每个Q的每个元素,则可以更简单地执行此操作。

答案 1 :(得分:1)

如果值的范围相当小(如示例所示),则可以使用具有线性时间复杂度的简单确定性解决方案。

  1. 让我们创建一个数组was(索引从1到10000,即通用集的每个元素都有一个单元格),最初填充false个值

  2. 对于q的每个元素Q,我们设置was[q] = true

  3. 现在我们遍历所有家庭集。对于每个集A_i,我们迭代集合的所有元素x并检查was[x]是否为真。如果不是至少有一个x,则A_i不是Q的子集。否则就是。

  4. 这个解决方案显然是正确的,因为它根据定义检查一个集合是否是另一个集合的子集。它也相当简单和确定。唯一潜在的缺点是它需要一个10000个元素的辅助数组,但它看起来可以用于大多数实际目的(无论如何,布隆过滤器也需要一些额外的空间)。