我需要一些想法来为我的作业开发一个好的散列函数。我列出了世界上所有国家(大约190个)的总数。每个国家/地区的名称是散列函数的关键。有没有特定类型的散列函数,任何人都会建议将这些数据存储在散列函数中而不会发生很多冲突?另外,您是否可以举例说明如何实施它?
答案 0 :(得分:2)
使用GNU gperf。对于像你这样的输入,它会为你生成C代码,它实现了一个完美的哈希函数(对于给定的输入)。没有碰撞,没有后顾之忧。
答案 1 :(得分:2)
您可以使用生成的完美哈希(GNU perf)。
如果字符串集是动态的,那么你可以使用三元组。 对于N个唯一字符串,它将为您提供唯一的数字[1..N]。对于您的情况,它将比使用哈希表更快。 这是我实现的这样的事情: http://code.google.com/p/tiscript/source/browse/trunk/tool/tl_ternary_tree.h
答案 2 :(得分:0)
我能想到的最简单的方法是为每个国家/地区的名称计算其表示中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。