我正在尝试为固定大小的集创建一个应该支持以下操作的数据结构:
在我的情况下,集合的大小可能非常小(4-16个元素),但查找必须尽可能快,并尽可能少地读取。此外,它需要节省空间。替换(即操作2)可能很少。我查看了以下选项:
其他信息:
关于如何解决这个问题的任何想法?
答案 0 :(得分:3)
Cuckoo Filter是一个应该考虑的选项。引用他们的摘要
咕咕过滤器:实际上比绽放更好
我们提出了一种名为cuckoo过滤器的新数据结构,它可以取代Bloom过滤器进行近似的集合成员测试。 Cuckoo过滤器支持动态添加和删除项目,同时实现比Bloom过滤器更高的性能。对于存储许多项目的应用程序 目标低误报率,**布谷鸟过滤器的空间开销低于空间优化的布隆过滤器。我们的实验结果还表明,布谷鸟过滤器胜过以前的数据结构,这些数据结构扩展了Bloom过滤器,以支持基本上在时间和空间上的删除。
答案 1 :(得分:2)
好吧,请注意以下几点:
使用标准哈希表,带有下降哈希函数(因为它是数字,有一堆标准哈希函数),带有4 | S |条目平均需要少于2个查找(假设无偏数作为输入),尽管它可能恶化到4 | S |的可怕最坏情况。当然你可以把它绑定如下:
- 如果搜索的单元格数超过k
- 中止并返回true(将导致FP在某种可能的情况下可以计算,并且将提供更快的最坏情况性能)。
关于计算布隆过滤器 - 这是实现它的方法,IMO。注意,布隆过滤器(标准)要求154位具有1%的FP概率,或100位具有5%的FP概率。 (*)
所以,如果你需要这个数字的4倍,你得到616位/ 400位,请注意,在大多数现代机器中,这个小到足以填充一些CPU-Cache块,这意味着(取决于机器) - 在某些机器上读取所有这些位实际上可能需要不到10个周期。
如果没有更高的FP率,IMO你无法做任何事情来打败它。
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 。
在处理从 有界宇宙,其中子集的大小相对较大 但还不够大,无法使用位图。