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.
也许你想要的只是一个快速集实现?如果这是出于学术目的,那么我建议找出你的教授想要什么。
我想知道查找时间为 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.
也许你想要的只是一个快速集实现?如果这是出于学术目的,那么我建议找出你的教授想要什么。