用于小集上的集合成员资格查询的快速空间高效数据结构

时间:2013-10-10 06:14:17

标签: algorithm data-structures hash language-agnostic set

我正在尝试为固定大小的集创建一个应该支持以下操作的数据结构:

  1. 查询元素是否在集合中(误报为正,否定为否定)
  2. 将该组的一个元素替换为另一个元素
  3. 在我的情况下,集合的大小可能非常小(4-16个元素),但查找必须尽可能快,并尽可能少地读取。此外,它需要节省空间。替换(即操作2)可能很少。我查看了以下选项:

    1. 布隆过滤器:这是标准解决方案。但是,很难删除元素,因此很难实现操作2.
    2. 计算布隆过滤器:空间要求比标准布隆过滤器的空间要求高得多(约3-4倍),不会降低假+ ve率。
    3. 只需存储所有元素的哈希列表:为类似空间要求计算布隆过滤器提供更好的假+率,但查找起来很昂贵(在最坏的情况下,所有位都将是抬起头来。)
    4. 以前对位置进行完美散列的想法:我对小组元素的快速完美哈希没有任何想法。
    5. 其他信息:

      • 元素是64位数字。

      关于如何解决这个问题的任何想法?

3 个答案:

答案 0 :(得分:3)

Cuckoo Filter是一个应该考虑的选项。引用他们的摘要

咕咕过滤器:实际上比绽放更好

  

我们提出了一种名为cuckoo过滤器的新数据结构,它可以取代Bloom过滤器进行近似的集合成员测试。 Cuckoo过滤器支持动态添加和删除项目,同时实现比Bloom过滤器更高的性能。对于存储许多项目的应用程序   目标低误报率,**布谷鸟过滤器的空间开销低于空间优化的布隆过滤器。我们的实验结果还表明,布谷鸟过滤器胜过以前的数据结构,这些数据结构扩展了Bloom过滤器,以支持基本上在时间和空间上的删除。

https://www.cs.cmu.edu/~dga/papers/cuckoo-conext2014.pdf

答案 1 :(得分:2)

好吧,请注意以下几点:

  1. 使用标准哈希表,带有下降哈希函数(因为它是数字,有一堆标准哈希函数),带有4 | S |条目平均需要少于2个查找(假设无偏数作为输入),尽管它可能恶化到4 | S |的可怕最坏情况。当然你可以把它绑定如下:

    - 如果搜索的单元格数超过k - 中止并返回true(将导致FP在某种可能的情况下可以计算,并且将提供更快的最坏情况性能)。

  2. 关于计算布隆过滤器 - 这是实现它的方法,IMO。注意,布隆过滤器(标准)要求154位具有1%的FP概率,或100位具有5%的FP概率。 (*)
    所以,如果你需要这个数字的4倍,你得到616位/ 400位,请注意,在大多数现代机器中,这个小到足以填充一些CPU-Cache块,这意味着(取决于机器) - 在某些机器上读取所有这些位实际上可能需要不到10个周期。 如果没有更高的FP率,IMO你无法做任何事情来打败它。

  3. (*)Calculated according to

      

    m = n ln(p)/ ln(2) 2

    PS 如果你能保证每个元素最多删除一次,你可以使用带有双倍空格的布隆过滤器的变体,而不是更好的FP,但也有一些FN,只需使用2个布隆过滤器:1个用于regular,1个用于deleted。如果元素位于regular而不是deleted中,则该元素位于集合中。
    这以提高FNs为代价提高了FP率

答案 2 :(得分:1)

签出succinct data structures,例如 Membership in Constant Time and Minimum Space

  

在处理从   有界宇宙,其中子集的大小相对较大   但还不够大,无法使用位图。