【问题标题】:Hashed Array Tips in C LanguageC 语言中的散列数组技巧
【发布时间】:2011-08-12 01:08:48
【问题描述】:

我需要一些想法来为我的作业开发一个好的散列函数。我总共有一份世界上所有国家(大约 190 个)的列表。每个国家的名称是散列函数的关键。是否有任何人会推荐一种特定类型的散列函数来将此数据存储在散列函数中而不会发生很多冲突?另外,能否举例说明一下如何实现?

【问题讨论】:

  • 一个类似的问题可能会有所帮助(java而不是c,但同样的原则适用)stackoverflow.com/questions/2624192/…
  • ISO 国家代码 - 适合整数,保证无冲突
  • @Erik:非常聪明;如果您将其作为答案,我会投票赞成。
  • @John:我认为这并不能真正回答 OPs 的问题,我会留下评论:P
  • 国名是英文还是ASCII码?

标签: c hashtable


【解决方案1】:

我能想到的最简单的方法是为每个国家/地区的名称计算其表示中的 ASCII 值的总和,并将其用作哈希值:

int hash(const char *s)
{
    int h = 0;

    while (s && *s)
          h += *s++;

    return h;
}

如果您的哈希映射大小为 N,则使用 map[hash(my_country) % N] = my_country 存储国家/地区名称。从概念上讲。

试试这种方法,看看得到的哈希值是否足够均匀分布。请注意,分布的质量也可能取决于 N。

【讨论】:

    【解决方案2】:

    您可以为此使用生成的完美哈希(GNU perf)。

    如果字符串集是动态的,那么您可以使用三元树。 对于 N 个唯一字符串,它将为您提供唯一编号 [1..N]。对于您的情况,它会比哈希表更快。 这是我对此类事情的实现: http://code.google.com/p/tiscript/source/browse/trunk/tool/tl_ternary_tree.h

    【讨论】:

    • 你也应该指向tries,三叉树的表弟更容易实现。
    【解决方案3】:

    使用GNU gperf。对于像您这样的输入,它将为您生成实现完美哈希函数的 C 代码(对于给定的输入)。无碰撞,无后顾之忧。

    【讨论】:

      猜你喜欢
      • 2012-01-30
      • 2021-03-11
      • 2011-12-08
      • 1970-01-01
      • 2011-01-21
      • 2019-01-21
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      相关资源
      最近更新 更多