我想知道一个具有O(1)查找时间的集合的简单数据结构。为了检测未排序链表中的重复值,我们可以说。
我能想出的最好的是bool数组,其中索引代表数字的值。但是根据范围,这可能具有非常高的空间复杂性。红黑树给出了O(logn)时间复杂度。
是否有替代方法,某种哈希表实现,可以帮助我在这里? 越简越好。
答案 0 :(得分:2)
这里有一个固有的空间与时间的权衡。要确保测试集成员资格最多需要O(1)操作,您需要至少O(n)大小的数据结构。一个bool
的数组可以做到这一点,或者你可以用一个数组构建一个bitset,比如unsigned int
(我已经为成千上万的成员设置了这个)。如果您希望相对于元素值的范围稀疏地填充集合,那么哈希表可以使您保持在O(n)空间级别(而基于数组的解决方案所需的空间与元素范围成比例)
答案 1 :(得分:1)
理论上,每组int
实现都会有O(1)
个复杂的查找时间。这是因为存在有限数量的不同int
值,因此存在集合大小的上限。
因此,即使树的查找时间是O(logN)
,在整数N的情况下,N具有最大值,例如N <= k。 log k 是一个常量,因此您的操作具有常量查找时间的上限。也就是说...... 无论你的算法有多慢,它都比INT_MAX + 1值更快
根据我的经验,当人们要求进行恒定时间设置查找时,他们真的只想要哈希。这有效地减小了 k 的大小(以内存为代价)。您的bool数组想法是一种极端情况,将 k 减少为1。
也许您想要的只是快速设置实现?如果这是出于学术目的,那么我建议找出你教授想要的东西。