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

时间:2010-03-23 13:58:25

标签: c integer set

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

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

http://uthash.sourceforge.net/

但我需要提出自己的哈希密钥生成器。

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

4 个答案:

答案 0 :(得分:3)

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

编辑:如果您正在寻找(外部)库,您将找到一些C和C ++哈希表实现here的比较。本文作者编写了一个名为khash的通用头实现。因此,您编译的二进制文件没有任何其他依赖项。

答案 1 :(得分:0)

编辑:抱歉,我开始回答因为它是C ++而不是C.是的,你应该找到你的哈希函数并自己编码..因为你已经知道了它的平均尺寸了没那么难,只需选择一个好的哈希函数!但是如果你想检查一个目录是否已存在,你需要在一个数字中编纂一整套。

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

int hashcode = initvalue
for (int i = 0; i < 0; ++i)
  hashcode = calc_code(hashcode, number_set[i], i);

以散列函数取决于其先前值,当前数字和当前索引的方式。

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 << ' ';

使用此数据结构可以轻松存储所有集合,但您还需要一种方法来检查目录中是否已包含集合。目前尚不清楚:您是否想知道目录中是否已存在具有所有SAME元素的集合?

你可以通过检查所有元素来手动完成,但由于你有数百万个元素,你应该找到一种方法来用一个唯一的数字来散列集合的元素并使用集合的映射。

答案 2 :(得分:0)

如果我理解正确,你想表示一组整数,我认为这些整数并不是特别微不足道。

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

typedef struct { 
  int size;
  int elems[1];
} intset;

,你可以用

创建一个新的集合(具有固定数量的元素)
intset *newset(int size) 
{ 
  intset *set;
  set = malloc(sizeof(intset) + sizeof(int)*(size-1));
  if (set) set->size = size;
  return set;
}

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

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

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

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

正如我所说,对我来说似乎并非无足轻重,我并不感到惊讶谷歌没有帮助。

但这并不是非常复杂,你只需要在继续之前做出一些决定。

答案 3 :(得分:-2)

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

http://en.wikipedia.org/wiki/Hash_table