我已经对哈希表进行了一些研究,并且一直遵循经验法则,即当存在一定数量的条目(最大值或通过诸如75%的负载因子)时,应该扩展哈希表。
几乎总是建议将哈希表的大小加倍(或加倍加1,即2n + 1)。但是,我还没有找到一个很好的理由。
为什么要加倍大小,而不是说增加25%或将其增加到下一个素数或下k个素数(例如三个)的大小?
我已经知道,选择初始哈希表大小(它是质数)通常是一个好主意,至少在您的哈希函数使用通用哈希等模数的情况下。我知道这就是为什么通常建议使用2n + 1而不是2n的原因(例如,http : //www.concentric.net/~Ttwang/tech/hashsize.htm)
但是,正如我说的,我没有看到任何真正的解释来说明为什么加倍或加一加倍实际上是一个好选择,而不是为新哈希表选择大小的其他方法。
(是的,我已经阅读了有关哈希表的Wikipedia文章:)http://en.wikipedia.org/wiki/Hash_table
例如,如果调整大小以恒定增量进行,则哈希表不能要求“摊销固定时间插入”。在那种情况下,调整大小的成本(随散列表的大小而增加)会使一次插入的成本在要插入的元素总数中成线性关系。由于调整大小随着表的大小变得越来越昂贵,因此必须“越来越少地”进行调整以保持摊销的插入成本不变。
大多数实现都允许平均存储桶占用量增长到调整大小之前预先确定的界限(介于0.5和3之间的任何值,这都是可接受的值)。按照这种约定,在调整大小之后,平均存储桶占用量将变为限制值的一半。通过加倍调整大小,可将平均存储桶占用保持在* 2的宽度范围内。
子注释:由于统计群集,如果要让多个存储桶最多具有一个元素(忽略缓存大小的复杂影响的最大速度),则平均存储桶占用必须低至0.5 3,如果您想要最少数量的空桶(对应于浪费的空间)。