C中整数集合的简单实现

Simple implementation of a set for ints in C

我想知道查找时间为 O(1) 的集合的简单数据结构。比方说,为了检测未排序的链表中的重复值。

我能想到的最好的是一个布尔数组,其中索引代表数字的值。但这可能具有非常高的 space 复杂性,具体取决于范围。红黑树的时间复杂度为 O(logn)。

是否有替代方法,hash-table 某种实现,可以帮助我? 越简单越好

这里有一个固有的 space 与时间权衡。为确保最多需要 O(1) 次操作来测试集成员资格,您需要至少 O(n) 大小的数据结构。 bool 的数组可以做到这一点,或者您可以从 unsigned int 的数组构建一个位集(我已经为达到几千个成员的集合这样做了)。如果您希望集合相对于其元素值的范围稀疏地填充,那么散列 table 可以使您保持在 O(n) space 级别(而 space基于数组的解决方案需要元素范围缩放。

理论上,每组 int 实施将具有 O(1) 复杂的查找时间。这是因为不同 int 值的数量是有限的,所以集合的大小有一个上限。

因此,即使树的查找时间是 O(logN),对于 N 具有最大值的整数,假设 N <= k。 log k 是一个常量,所以你的操作有一个常量查找时间的上限。也就是说... 无论你的算法有多慢,它都比 INT_MAX + 1 个值

根据我的经验,当人们要求进行恒定时间集合查找时,他们实际上只需要散列。这有效地减少了 k 的大小(以内存为代价)。您的 bool 数组想法是一个极端情况,将 k 减少到 1.

也许你想要的只是一个快速集实现?如果这是出于学术目的,那么我建议找出你的教授想要什么。