在 C 中创建哈希表

Creating Hash tables in C

我是哈希概念的新手 tables.I 我正在尝试创建一个非常简单的哈希 table 来理解这个概念。我已经了解如何为散列目的创建基本散列函数。不过我不明白怎么把它link改成剩下的table。我对如何开始创建 table 、查找函数、删除 table 中的条目等感到困惑。

散列函数看起来像这样 found here

unsigned int hash(hash_table_t *hashtable, char *str)
{
    unsigned int hashval;

    /* we start our hash out at 0 */
    hashval = 0;

    /* for each character, we multiply the old hash by 31 and add the current
     * character.  Remember that shifting a number left is equivalent to 
     * multiplying it by 2 raised to the number of places shifted.  So we 
     * are in effect multiplying hashval by 32 and then subtracting hashval.  
     * Why do we do this?  Because shifting and subtraction are much more 
     * efficient operations than multiplication.
     */
    for(; *str != '[=10=]'; str++) hashval = *str + (hashval << 5) - hashval;

    /* we then return the hash value mod the hashtable size so that it will
     * fit into the necessary range
     */
    return hashval % hashtable->size;
}

但是我不明白其他部分,比如如何创建table、查找等等..

有人可以帮助我吗?我感谢任何形式的帮助。

与其告诉你如何编码,我会告诉你你想要学习的领域的名称:Data Structures and Algorithms

关于这个问题的大多数书籍都会给你一个关于如何创建散列的例子table。我的建议是,从比 C 更简单的语言开始,了解概念,然后再回到 C。

非常 简单地把散列 table 通过将数据拆分成更小的存储单元(称为桶)来工作。这些内部存储单元由索引访问,索引是存储在桶内的值的哈希码。注意 values 中的 s。您需要能够在一个存储桶中存储多个值以支持哈希码冲突。

所以散列有几个基本操作 table。

  1. Contains - 要进行包含检查,您需要计算哈希值以找到数据应位于的存储桶。找到正确的存储桶后,您需要检查每个那里的平等项目(你选择如何实现这个。)
  2. Add - 向 table 添加新项目需要像 Contains 中那样进行类似的检查,以防止您添加任何项目两次。
  3. 删除 - 你可以猜到。以与 Contains 相同的方式查找项目并将其从存储桶中移除。

也就是说,您需要实施存储桶。直截了当地说你需要一个列表列表。对于第一层,您需要一些支持索引访问的集合。由于您使用 C,所以一个简单的数组是可行的方法。我建议你不要为你的桶使用整数的整个范围(你可以这样做,但这会使它更难理解和调试)。只需应用模运算即可适当减少哈希码的范围。对于第二部分,我建议使用链表之类的东西来支持动态增长。

所以你根据数组索引找到你的链表,然后你处理链表中的每个项目以找到正确的项目。这也说明了为什么哈希冲突会降低哈希 table 的效率。如果你没有散列冲突,你只需要一个测试来找到这个项目,这是时间常数。如果您有哈希冲突,您需要检查多个值。

哈希冲突是两个不同的值返回相同的哈希码。

希望这能让您了解如何开始。并且不要听任何人的。 C 是一种很棒的入门语言。

基本概念很简单:

  1. 使用一个非常大的数组来存储数据
  2. 使用散列函数对数组进行索引
  3. 你会遇到冲突——所以找出一种机制来处理这些冲突(链表可能是最简单的)

因此,当您要写入数据时:index = hash_function(); array[index] = data.与读取类似。

一旦你阅读了更多关于哈希表的内容,你就会明白其余的事情。