Algorithm 有效地实施一个;常数;设置ADT

Algorithm 有效地实施一个;常数;设置ADT,algorithm,data-structures,language-agnostic,set,Algorithm,Data Structures,Language Agnostic,Set,我需要实现一个“常量”集合。即,仅支持成员资格测试的数据结构。另外(当然),我需要一个工厂例程,给定元素列表,构造一个常量集 请注意,不仅常量集不允许突变,而且我不需要返回新常量集的“添加”操作(也就是说,一旦初始化发生,我只对测试元素是否在集合中感兴趣) 古旧的哈希表在这里是一个明显的选择,但我想知道,我们是否可以利用这样一个事实:我们只需要支持一个操作(而且,在构造集合时,我们知道它的所有元素是什么)?有没有一种数据结构(可能是一种特殊类型的哈希表)在这里表现得特别好?从理论上讲,它不会比哈

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

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


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

从理论上讲,它不会比哈希表的O(1)快,因为O(1)是最快的(除了完全避免做任何事情,即O(0);)

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


如果bloom筛选器足够小,可以装入一级缓存线,这样就不必访问主内存,那么bloom筛选器甚至可能值得用于内存集,但这可能是过早的优化。

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


希望这有帮助

也许吧?你在找什么样的大O?恒定时间?贾斯汀:是的,恒定时间。但它超越了这一点:我们已经可以用“常规”哈希表得到O(1)?我们能做得更好吗,不是渐进的,而是在实践中(通过具有较低的常数、更好的缓存局部性等)?@abeln好的,具有初始容量的哈希表应该使用良好的数字。它不再是摊余成本。我知道哈希表的渐近下界是最优的。我甚至不反对哈希表。问题是,我是否可以利用我的附加约束构建一个在这里特别有效的数据结构(可能是一种特定类型的哈希表)对不起,我应该仔细读一读。我喜欢bloom过滤器的想法(即,它可能适合缓存线)。然而,我的套件不太可能很大,它们肯定适合RAM。我想我已经足够具体了,解决方案是尝试一些东西并对其进行分析。查看不可变集合的源代码非常有启发性。
gperf
也是一件事。