我需要实现一个“常量”集。也就是说,只支持成员资格测试的数据结构。另外(当然),我需要一个工厂例程,给定一个元素列表,构造一个常量集。
请注意,不仅在常量集上不允许变异,而且我不需要返回新常量集的“add”操作(也就是说,一旦初始化发生,我只对测试感兴趣元素是否在集合中。)
答案 0 :(得分:5)
正如@Alexandre C.在评论中提到的,这是一个使用完美哈希表的绝佳位置。完美的哈希表是一个哈希表,它使用哈希函数来保证其元素之间不会发生冲突。有各种方案来实现这一目标;最常见和最简单的选项之一是使用FKS perfect hash table,它使用两层哈希表。它保证了最坏情况下的O(1)成员资格测试,并且在实践中非常有效。
希望这有帮助!
答案 1 :(得分:1)
从理论的角度来看,它没有比散列表的O(1)快得多,只是因为O(1)是最快的(除了避免做任何事情,即O(0)) ;))
如果您的哈希表非常大(因此必须将其存储在磁盘上,甚至分布在多台计算机上),bloom filter可以为您提供快速的成员资格概率测试。
如果过滤器足够小以适应L1高速缓存行,那么对于内存集合,布隆过滤器甚至是值得的,因此您不必点击主内存,但这可能是过早的优化。