在 C 中寻找数组(与链表)哈希表实现

Posted

技术标签:

【中文标题】在 C 中寻找数组(与链表)哈希表实现【英文标题】:Looking for an array (vs linked list) hashtable implementation in C 【发布时间】:2011-02-13 10:31:45 【问题描述】:

我正在寻找 C 中的哈希表实现,它将其对象存储在(二维)数组而不是链表中。 即如果发生碰撞,导致碰撞的对象将存储在下一个空闲行索引中,而不是推送到链表的头部和第一个元素。

另外,对象本身必须被复制到哈希表中,而不是被指针引用。 (对象不会在程序的整个生命周期中存在,但表会存在)。

我知道这样的实现可能存在严重的效率缺陷,并且不是“标准的散列方式”,但是当我在一个非常特殊的系统架构上工作时,我需要这些特性。

谢谢

【问题讨论】:

既然你对它的实现有如此不寻常和具体的要求,我敢打赌你最好的办法是自己编写这样一个实现。 +1,一个有趣的问题。 【参考方案1】:

一个超级简单的实现:

char hashtable[MAX_KEY][MAX_MEMORY];
int counts[MAX_KEY] = 0; 

/* Inserting something into the table */
SomeStruct* some_struct;
int hashcode = compute_code(some_struct);
int size = sizeof(SomeStruct); 
memcpy(hashtable[hashcode] + counts[hashcode] * size, some_struct, size);
++counts[hashcode];

别忘了检查MAX_MEMORY

【讨论】:

【参考方案2】:

我的猜测是您的系统不允许动态内存分配。因此,您需要为您的数据(总对象数和最大预期冲突)定义合理的前端数组边界,另外还需要为您的对象定义一个自定义哈希函数,因此最好实现您自己的哈希表。

【讨论】:

动态内存分配是允许的,但系统是一个多核架构,如果共享数据存储在连续内存中,效果最好,这就是我想使用数组的原因。计算最大预期碰撞是一个很好的提示,谢谢! @kingusiu:如果将普通链表链式哈希与池分配器放在一起,它可能对您有用,这样所有对象都从一个连续池中分配。前向和后向链接甚至不必是指针——它们可以只是池索引。【参考方案3】:

它不是 C 语言,而是 C++ 语言,但请看一下 Google Sparse Hash - 可能会给您一些想法。关键要求是被存储的对象有一个方法是null

【讨论】:

以上是关于在 C 中寻找数组(与链表)哈希表实现的主要内容,如果未能解决你的问题,请参考以下文章

环形链表(哈希表链表)寻找两个正序数组的中位数(数组二分查找)二进制求和(位运算数学)

数据结构与算法HashTable(转)

为啥哈希表在存储桶的数组上使用链表?

哈希表 - 链表数组 - C++

如果我们使用链表数组来实现哈希表,那么“add”可以以一种不需要遍历的方式来实现。这是对还是错?

数组链表哈希表