为什么哈希表(数据结构)大小必须是素数?
据我了解,它确保了更均匀的分布,但还有其他原因吗?
答案 0 :(得分:28)
唯一的原因是避免将值聚集到少量桶中(是的,分发)。更均匀的分布式哈希表将更加一致地执行。
来自http://srinvis.blogspot.com/2006/07/hash-table-lengths-and-prime-numbers.html
如果假设你的hashCode函数导致以下hashCodes {x,2x,3x,4x,5x,6x ...},那么所有这些都将集中在m个桶中,其中m = table_length / GreatestCommonFactor(table_length,x)。 (验证/得出这个是微不足道的)。现在,您可以执行以下操作之一以避免群集
确保您不会生成太多的hashCode,这些hashCode是{x,2x,3x,4x,5x,6x ...}中的另一个hashCode的倍数。但如果这可能有点困难,如果你的hashTable应该有数百万条目。
- 醇>
或者通过使GreatestCommonFactor(table_length,x)等于1来简单地使m等于table_length,即通过使table_length与x进行互操作。如果x可以是任何数字,那么请确保table_length是素数。
答案 1 :(得分:-5)
无论你使用什么哈希函数,你都会得到一个整数。为了将其映射到散列表,通常你会mod
具有散列表大小的整数,以使该值小于表的大小,以便映射它。
返回hashVal%tableSize
从这一点开始我有点失落,但是如果tableSize是偶数,那么IIRC,所有条目都是偶数。哈希表的一半永远不会被填充。