散列整数集以进行包含测试


10

我正在寻找一组H(。)和关系R(。,。)的哈希函数,以便如果A包含在B中,则R(H(A),H(B))。当然,R(。,。)必须易于验证(恒定时间),而H(A)应该以线性时间计算。

H和R的一个示例是:

  • H(A)=xA1<<(h(x)modk),其中k是固定整数,h(x)是整数上的哈希函数。
  • R(H(A),H(B))=((H(A)&H(B))== H(A))

还有其他好的例子吗?(很难定义好,但是从直觉上来说,如果R(H(A),H(B)),那么b中会包含whp A)。

以后编辑

  1. 我正在寻找一系列哈希函数。我有很多套;每组3-8个元素;其中90%具有3或4个元素。在这种情况下,我给出的示例哈希函数分布不佳。
  2. H(。)(在我的示例中为k)的位数应较小(即H(。)必须为整数或长整数)。
  3. R的一个不错的特性是,如果H(。)具有k位,则对于(3 ^ k-2 ^ k)/ 4 ^ k对,即R(。,。)为true。几双。
  4. 布隆过滤器特别适合大型设备。我尝试使用BF解决此问题,但最佳结果只有一个功能。

(来自stackoverflow的交叉报道,我没有收到足够好的答案)


“ whp”超过了什么?您是否假设您的输入来自某个分布?
Jukka Suomela 2010年

您是否真的在寻找一个固定的哈希函数而不是哈希函数系列?
Jukka Suomela 2010年

@Jukka:我认为他的意思是如果R(H(A),H(B)),那么我们很有可能得出A是B的子集的可能性。该概率接管了A和B的随机选择,内部抛硬币H和R(如果有)。
MS Dousti

我正在寻找一系列哈希函数。我的集合通常很小(每个3-8个元素;其中90%具有3或4个元素),所以我给出的示例哈希函数分布得不太好。
亚历山德鲁

R的一个不错的特性是,如果H(。)具有n位,则对于(3 ^ n-2 ^ n)/ 4 ^ n对,即,R(。,。)为true。几双。
亚历山德鲁

Answers:


10

(此答案原本是在评论中,但我根据Suresh的建议将其移至另一个答案。)

对于集非常小的应用程序,您可能希望Bloom散列函数的数量很大,以最大程度减少误报的数量。为了节省计算时间,我建议使用布隆过滤器的以下变体。假设您具有三个传统的哈希函数,和,每个元素均生成位字符串。将这三个哈希函数中的每个元素按位散列。生成的元素哈希将约为kh1h2h3m23=1/8th那些。将每个集合散列为其组成元素的按位散列或散列。由于您的集合包含3-8个元素,因此产生的哈希值将接近一半的哈希值,这大概是您希望最大程度地降低误报率的原因。

以上方案之间的区别是传统的Bloom滤波器类似于经典的鄂尔多斯随机图模型与随机正则图之间的区别。上述方案的Bloom散列的有效数在其平均值附近略有变化,但是很大,因此该差异无关紧要。Gn,pdkm/8m/8


如您所建议的,这对于大m(32或64)特别有用。
亚历山德鲁

4

我会尝试使用布隆过滤器作为与您的提案相同的关系的哈希。为您的应用程序计算最佳的过滤器大小和哈希函数数量应该不会太麻烦;请参阅Wikipedia的Bloom Filter文章以获取灵感。根据您希望避免误报的严重程度,例如和可能就足够了。mkm=64k=4


对于非常小的集合的应用程序,您可能希望很大。使用传统方法可能会很慢。我建议以下内容。k
沃伦·舒迪

(先前评论的继续)这本质上是Bloom过滤器的变体。假设对于产生位字符串的元素,您具有三个哈希函数,和。将元素散列为按位和这三个元素。产生的哈希值大约为1/8的1s。将集合散列为其组成元素的按位散列或散列。由于您的集合包含3-8个元素,因此产生的哈希值将占一半的哈希值,这很可能有助于降低误报率。h1h2h3m
沃伦·舒迪

这种变化的优点仅仅是,它可以更好地利用大多数计算机在字操作中固有的并行性。
沃伦·舒迪

沃伦,您应该将此作为答案发布。它值得一些投票
Suresh Venkat 2010年

2
@ Warren,@ Suresh:我认为将这两个密切相关的答案组合在一起,然后删除评论会更有意义。遵循起来会更容易,特别是因为其中一个答案引用了另一个定义的参数。
Jukka Suomela 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.