【问题标题】:Creating Hash tables in C [closed]在 C 中创建哈希表 [关闭]
【发布时间】:2015-09-24 16:58:34
【问题描述】:

我是哈希表概念的新手。我正在尝试创建一个非常简单的哈希表来理解这个概念。我已经了解如何为散列目的创建基本散列函数。但是我不明白如何将它链接到表格的其余部分。我对如何开始创建表、创建查找函数、删除表中的条目等感到困惑。

哈希函数看起来像这样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 != '\0'; 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;
}

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

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

【问题讨论】:

  • 这个问题太宽泛,无法给出一个好的答案,但您可能想了解如何实现单链表。哈希表中的每个桶都可以使用单链表来实现,所以一旦你完成了这个工作,你就可以通过使用一个常量哈希函数(即它总是产生相同的哈希和)来测试你的哈希表,这样所有的结果都在同一个桶。
  • 您可以在其他问题stackoverflow.com/q/1138742/3545273中找到一些实现示例

标签: c hashtable


【解决方案1】:

基本概念很简单:

  1. 使用非常大的数组来存储数据
  2. 使用哈希函数索引数组
  3. 你会遇到冲突——所以想办法解决这些问题(链表可能是最简单的)

所以,当你要写入数据时:index = hash_function(); array[index] = data. 类似的读取。

您将在阅读有关哈希表的更多信息后弄清楚其余部分。

【讨论】:

  • 感谢您的帮助。 :)
【解决方案2】:

非常只需将数据拆分为更小的存储单元(称为存储桶)即可使用哈希表。这些内部存储单元由索引访问,索引是存储在存储桶内的值的哈希码。注意 values 中的 s。您需要能够在一个存储桶中存储多个值以支持哈希码冲突。

因此,人们期望哈希表有几个基本操作。

  1. 包含 - 要进行包含检查,您需要计算哈希值以找到数据应该在的存储桶。一旦找到正确的存储桶,您需要检查其中的每个项目是否相等(无论如何你选择实现它。)
  2. 添加 - 将新项目添加到表中需要类似于 包含 中的检查,以防止您将任何项目添加两次。
  3. 删除 - 你可以猜到。以与您的 Contains 相同的方式找到该项目并将其从存储桶中删除。

话虽如此,您需要实现存储桶。明确地说你需要一个列表列表。对于第一层,您需要一些支持索引访问的集合。由于您使用 C,因此可以使用简单的数组。我建议您不要为您的存储桶使用整数的全部范围(您可以这样做,但这会使其更难理解和调试)。只需应用模运算即可正确缩小哈希码的范围。对于第二部分,我建议使用链表之类的东西来支持动态增长。

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

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

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

【讨论】:

  • 感谢您的帮助。它使概念更加清晰 :) 我现在将尝试实现它。
【解决方案3】:

而不是告诉你如何编码,我会告诉你你要学习的领域的名称:Data Structures and Algorithms

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

【讨论】:

  • 感谢您的回复。我实际上已经理解了哈希表的概念。我知道它是如何工作的。我所需要的只是一个关于如何现在创建哈希表的简单示例。但无论如何感谢您的帮助:)
  • 大部分书籍,也有代码示例...
猜你喜欢
  • 2013-03-05
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
  • 2013-04-25
  • 2019-12-20
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多