高效实现“常量”设置ADT

时间:2013-11-07 19:50:50

标签: algorithm data-structures language-agnostic set

我需要实现一个“常量”集。也就是说,只支持成员资格测试的数据结构。另外(当然),我需要一个工厂例程,给定一个元素列表,构造一个常量集。

请注意,不仅在常量集上不允许变异,而且我不需要返回新常量集的“add”操作(也就是说,一旦初始化发生,我只对测试感兴趣元素是否在集合中。)

Goold旧哈希表在这里是一个明显的选择,但我想知道,我们能否以某种方式利用我们只需要支持一个操作的事实(并且,在构造集合时,我们知道它的所有元素将是什么)?是否有一个数据结构(可能是一种特殊类型的哈希表),在这里表现得特别好?

2 个答案:

答案 0 :(得分:5)

正如@Alexandre C.在评论中提到的,这是一个使用完美哈希表的绝佳位置。完美的哈希表是一个哈希表,它使用哈希函数来保证其元素之间不会发生冲突。有各种方案来实现这一目标;最常见和最简单的选项之一是使用FKS perfect hash table,它使用两层哈希表。它保证了最坏情况下的O(1)成员资格测试,并且在实践中非常有效。

希望这有帮助!

答案 1 :(得分:1)

从理论的角度来看,它没有比散列表的O(1)快得多,只是因为O(1)是最快的(除了避免做任何事情,即O(0)) ;))

如果您的哈希表非常大(因此必须将其存储在磁盘上,甚至分布在多台计算机上),bloom filter可以为您提供快速的成员资格概率测试。

如果过滤器足够小以适应L1高速缓存行,那么对于内存集合,布隆过滤器甚至是值得的,因此您不必点击主内存,但这可能是过早的优化。