【问题标题】:Implementing a Hash Table using C使用 C 实现哈希表
【发布时间】:2015-01-14 16:53:52
【问题描述】:

我正在尝试读取一个名称文件,并根据它们的字母值将这些名称散列到一个位置。我已成功获取文件中每个名称的值,但在创建哈希表时遇到了问题。我可以只使用一个常规数组并编写一个函数来将单词放在它们的值的索引处吗?

while (fgets(name,100, ptr_file)!=NULL) //while file isn't empty
            {
            fscanf(ptr_file, "%s", &name); //get the first name
            printf("%s ",name); //prints the name
            int length = strlen(name); // gets the length of the name
            int i;
            for (i =0; i <length; i++) 
            //for the length of the string add each letter's value up
                {
                value = value + name [i];
                value=value%50;
                }
            printf("value= %1d\n", value);
            }

【问题讨论】:

  • 我认为您没有成功获取名称,因为您从文件中读取了两次。除了fscanf(ptr_file, "%s", &amp;name); 似乎是错误的事实之外,因为您这样做了fgets(name, 100, ptr_file)
  • 是的,你可以。但请记住,在一个值上可能有多个单词,即哈希冲突。为了减少冲突的机会,您可以使用更好的哈希函数,或者如果您只想使用它,您将不得不选择在哈希数组中的一个值处存储多个单词
  • 注意:使用散列,如果nvalue%n 中的质数,通常数据会更好地分散。

标签: c arrays string file hashtable


【解决方案1】:

不,您不能,因为您会遇到冲突,因此您必须将多个值考虑到单个哈希中。一般来说,你的散列并不是一个真正明智的实现——你为什么将值的范围限制为 50?内存真的真的很稀疏吗,所以你的字典不能超过 50 个指针?

我建议使用现有的 C 字符串哈希表实现,例如 2001 年的 this one

【讨论】:

  • @iharob 所以如果我把这段代码变成一个返回值的函数,这个值就不对了吗?我只需要一个 fgets 或 fscanf 而不是两者都需要吗?我是否会将哈希表放入 while 循环中,以便在读取名称时计算值并放置它?
【解决方案2】:

通常,您会遇到哈希冲突,您需要找到一种方法来处理它。处理这种情况的两种主要方法如下:

  1. 如果采用哈希表条目,则使用下一个条目,并迭代直到找到一个空条目。查找时,您需要做类似的事情。这对于向哈希表中添加内容来说既好又简单,但删除内容却很棘手。

  2. 使用哈希桶。每个哈希表条目是具有相同哈希值的条目的链接列表。首先你找到你的哈希桶,然后你找到列表中的条目。添加新条目时,只需将其添加到列表中即可。

【讨论】:

    【解决方案3】:

    这是我的演示程序,它从标准输入读取字符串(单词),并且 存入哈希表。此后(在 EOF),迭代哈希表,并计算单词数、不同单词,并打印最常见的单词:

    http://olegh.cc.st/src/words.c.txt
    

    在哈希表中,使用了双重哈希算法。

    【讨论】:

      猜你喜欢
      • 2014-02-13
      • 2011-01-30
      • 2012-05-27
      • 2017-03-20
      • 2012-10-30
      • 2020-12-30
      • 1970-01-01
      • 2016-03-25
      相关资源
      最近更新 更多