假设我正在将非空字符串(char [] / char * s)传输到我的程序中。我想创建一组它们。也就是说,对于集合S中的任何元素a,a在S中是唯一的。
我曾想过以某种方式解决这个问题,但遇到了问题。
如果我知道我将阅读的项目数量,我可以创建一个哈希表,所有元素都以null开头,大小相同,如果发生冲突,请不要将其插入该表中。完成插入后,我将迭代哈希表的数组,计算非空值,大小,然后创建该大小的数组,然后将所有值复制到它。
我可以使用单个数组并在添加元素之前调整大小,使用搜索算法在调整大小/添加元素之前检查元素是否已存在。
我意识到第二种方法可行,但由于元素可能无法排序,因此无论是选择搜索算法还是调整大小,都可能需要很长时间才能进行大输入。
任何输入都将不胜感激。如果您需要更多信息,请随时在下面的评论栏中提问。图书馆会非常有帮助! (谷歌搜索“在C中设置”和类似的东西并没有多大帮助。)
答案 0 :(得分:2)
即使你不知道要插入的元素数量的大小,哈希表也可以工作...你只需要定义哈希表来使用“桶”(即每个位置都是实际上是散列到相同值的元素的链接列表,并且您将搜索每个“桶”以确保每个元素尚未插入到散列表中。避免大量“桶”搜索的关键是一个很好的哈希算法。
如果您可以定义对象的弱排序,也可以使用二叉搜索树。然后,如果!(A< B)和!(B< A),则可以假设A == B,因此您不会将该对象的任何额外迭代插入到树中,这又将定义一个集合。
虽然我知道你在使用C,但考虑到在C ++ STL中,std::set
使用RB树(红黑树,它是一个平衡的二叉搜索树),{{1}使用哈希表。
使用数组是一个坏主意...调整操作将花费很长时间,其中 - 在树中插入可以在O(log N)时间内完成,而对于散列表,ammortized O(1 )。