字典/ hash_map密钥大小

时间:2010-11-09 04:14:56

标签: c# c++ data-structures

计算密钥的哈希值并除以素数。 一般来说,是否有任何标准素数(比如32/64位)?

我的理解是散列表不可调整大小/可调整,其内部数组依赖于此。如果我只有5个元素的哈希表,关键空间会有浪费吗?

编辑:我应该更好地构建它。什么是c ++ hash_map(boost)或C#Dictionary

中遵循的一般方法

3 个答案:

答案 0 :(得分:2)

实际上,哈希表大小可以自动调整。你可能会做的是分配一个大小为N的数组,使用散列模N(一些素数)来索引数组。如果你跟踪分配的密度,那么当它增加超过某个阈值时,你可以分配一个大小为N1(一些较大的素数)的新数组,并复制旧数组中的每个元素,应用哈希函数和 new modulo以在新哈希表中找到它的位置。最后,您释放旧数组并使用新的更大的数组。

答案 1 :(得分:1)

通常,素数用作内部数组的大小。也就是说,如果某人要求提供100个项目的哈希表,则选择下一个> = 100的素数,这就是大小。在这种情况下,您的表格大小为101。

但这不是唯一的方法。

答案 2 :(得分:1)

为什么不使用Reflector来查看C#Dictionary或HashTable实现? Greg和Jim的两个答案在一般术语和C#实现方面都是正确的。

总之,C#Dictionary实现使用素数(大于其容量)作为内部桶阵列的大小,并使用它来划分哈希码。每当需要调整内部阵列的大小时,它会将现有容量的两倍用作新容量。