什么是一组整数集的简单C库?

什么是一组整数集的简单C库?,c,integer,set,C,Integer,Set,我必须修改一个C程序,我需要包含一组无符号整数集。也就是说,我有数百万个整数集(每个整数集包含3到100个整数),我需要将它们存储在某种结构中,我们称之为目录,它可以在对数时间内告诉我给定的整数集是否已经存在于目录中。需要在目录上定义的唯一操作是查找和插入 这在内置了对有用数据结构支持的语言中是很容易的,但我是C语言的外国人,在谷歌上四处看看(令人惊讶地)并没有令人满意地回答我的问题。该项目看起来大致正确: 但我需要拿出我自己的散列密钥生成器 这是一个标准的、简单的问题,所以我希望有一个标准的

我必须修改一个C程序,我需要包含一组无符号整数集。也就是说,我有数百万个整数集(每个整数集包含3到100个整数),我需要将它们存储在某种结构中,我们称之为目录,它可以在对数时间内告诉我给定的整数集是否已经存在于目录中。需要在目录上定义的唯一操作是查找和插入

这在内置了对有用数据结构支持的语言中是很容易的,但我是C语言的外国人,在谷歌上四处看看(令人惊讶地)并没有令人满意地回答我的问题。该项目看起来大致正确:

但我需要拿出我自己的散列密钥生成器


这是一个标准的、简单的问题,所以我希望有一个标准的、简单的解决方案。

自己实现一个简单的哈希表。当您知道如何自己实现一个时,它将使您成为一个更好的程序员


<> > > >编辑:对不起,我开始回答,因为它是C++而不是C。是的,然后你应该找到你的哈希函数并自己编码。既然你已经知道一个集合的平均维数了,那么就选择一个好的散列函数吧!但如果您想检查目录是否已经存在,则需要将整个集合编码为一个数字

您可以尝试对集合中的单个数字进行迭代散列:

int hashcode = initvalue
for (int i = 0; i < 0; ++i)
  hashcode = calc_code(hashcode, number_set[i], i);
int hashcode=initvalue
对于(int i=0;i<0;++i)
hashcode=计算代码(hashcode,数字集[i],i);
在某种程度上,hashfunction依赖于它以前的值、当前的数字和当前的索引

STL集呢

#include <set>

int nums[6] = {1,6,34,2,67,41};
set<int> numbers;

for( int i = 0; i < 6; ++i ) numbers.insert(nums[i]);

for( set<int>::const_iterator iter = numbers.begin(); iter != numbers.end(); ++iter )
  cout << *iter << ' ';
#包括
int nums[6]={1,6,34,2,67,41};
设定数字;
对于(int i=0;i<6;++i)数字,插入(nums[i]);
for(set::const_iterator iter=numbers.begin();iter!=numbers.end();++iter)

cout如果我理解正确的话,你想要表示一组整数,我认为这并不是很简单

第一点是表示一组整数。最简单的方法是使用如下可变大小数组:

typedef struct { 
  int size;
  int elems[1];
} intset;
然后,您可以使用创建一个新集合(具有固定数量的元素)

并使用
set->elems[0]=i1;存储元素

另一种选择是使用位数组,但实现将取决于要存储的整数的性质(例如,它们是否在固定范围内?它们通常在集合中成组出现吗?)

一旦有了整数集,就需要一个比较函数(以确定两个集合是否具有相同的元素)。如果选择一个数组来表示一个集合,并对该数组进行排序,那么检查两个集合是否相同非常简单;如果它是位图,则取决于您如何实现它

现在,对于集合集,您可以选择一个(排序的)向量,插入元素时可能需要不时调整其大小,或者选择一个哈希表。在后一种情况下,您需要为整数集编写一个哈希函数(可能使用现有函数!)

正如我所说,这对我来说似乎并不微不足道,我并不惊讶谷歌没有提供帮助


不过,这并不十分复杂,您只需在继续之前做出一些决定。

这取决于您将如何处理数据。但也许你已经做了你想要的。您还可以为每个集合构建一个排序数组,并使用bsearch查找值,尽管在插入过程中性能可能会受到影响


<>编辑:如果你正在寻找一个(外部)库,你会发现一些C和C++哈希表的实现比较。本文作者编写了一个名为的通用头实现。所以你编译的二进制文件没有任何附加的依赖。< /P> OP询问C程序,STL是纯C++。STL是C++的,这个问题被标记为“C”,是的,对不起,我编辑了它:)刚刚醒来。仍然有一点模糊这可能是真的,它会使我成为一个更好的程序员来实现这一点自己。然而,这不是一个很好的答案。如果我只是想成为一名更好的程序员,我可能会花时间做一些更好的练习。此外,我不太可能实现性能最佳的解决方案,而且一个高性能的解决方案很可能需要我很多时间来实现。我觉得奇怪的是,没有像C++的STL这样的库,它会给我一个简单的解决方案,而我需要重新发明(或重新实现)这个轮子。你不是真的回答问题,我很惊讶地听到它不是微不足道的,因为在其他语言(即使是类似的C++与其STL),它也将是微不足道的。整数值是无符号的,在某些固定范围内(如运行时已知的范围,而不是编译时),在大多数情况下介于0到1000万之间,但在某些情况下介于0到1亿之间。如果我使用哈希表,会想到任何哈希函数吗?zoborist散列在这里合适吗?tsearch非常适合管理泛型元素的二叉树。它不会两次添加元素,所以我们可以将其用于集合。
intset *newset(int size) 
{ 
  intset *set;
  set = malloc(sizeof(intset) + sizeof(int)*(size-1));
  if (set) set->size = size;
  return set;
}