如何选择哈希表的大小?

时间:2014-03-30 08:40:17

标签: c data-structures hash hashmap

假设我有200.000个单词,并且我将使用hash*33 + word[i]作为哈希函数,对于最小化内存/分页问题,​​优化表的大小应该是多少?

使用的平台 - C(c99版本),

单词是英文字符,ASCII值

哈希表的一次初始化(链接列表样式的桶),

用于搜索下一个,如字典搜索。

碰撞后,该单词将作为新节点添加到存储桶中。

1 个答案:

答案 0 :(得分:9)

一个好的经验法则是将负载系数保持在75%或更低(有些人会说70%)以维持(非常接近)O(1)查找。 假设你有一个很好的哈希函数。

基于此,您需要至少约266,700个桶(75%)或285,700个桶(70%)。假设没有碰撞。

那就是说,你最好的办法是用各种哈希表大小的样本数据进行测试,看看你得到了多少次碰撞。

您可能还会考虑比hash*33 + word[i]更好的哈希函数。 Jenkins hash及其变体需要更多计算,但它们可以提供更好的分布,因此通常可以减少冲突并缩小所需的表格大小。

你也可以在这个问题上抛出记忆。表大小为500,000可以为您提供40%的最小加载因子,这可以弥补您的哈希函数的缺点。但是,你很快就会达到收益递减的程度。也就是说,使表格大小为100万,可以给出20%的理论载荷因子,但几乎可以肯定你实际上并没有意识到这一点。

长话短说:使用更好的哈希函数并在不同的表格大小上进行一些测试。

minimal perfect hash之类的东西。如果您知道输入数据是什么(即它没有改变),那么您可以创建一个保证O(1)查找的哈希函数。它也非常节省空间。但是,我不知道为200,000个项目创建最小完美哈希是多么困难。