你什么时候会重新哈希链接哈希 table?

When would you rehash a chaining hash table?

在链接哈希 table 中插入时,您什么时候重新哈希?当 alpha = 1 时重新散列会更好吗? (alpha = 存储的元素数 / 散列大小 table)

使用链接时,您通常会希望在任何存储桶包含的项目超过设定数量时调整大小。例如,您可能决定一个桶最多包含 5 个项目是可以的。第一次将第六项插入桶中时,您重新调整 table.

的大小

或者,您可能会决定理想的数量是 10 或 3。这取决于您希望如何平衡检索性能与调整大小时间。存储桶越小,平均查找速度越快,但您必须更频繁地调整 table 的大小。使用更大的存储桶大小,您不必经常调整大小,但平均查找时间会更长。

最坏情况下,存储桶大小为 10 的查找时间将比存储桶大小为 2 的查找时间慢五倍。但它仍然比列表的顺序扫描快很多,并且您可以获得必须重新散列的次数减少 5 倍。您应该为您的应用程序试验最佳存储桶大小。

使用更大的存储桶可以缩短查找时间的一件事是,在查找时,将刚刚引用的项目移动到其存储桶中列表的头部。这里的理论是有些项目比其他项目更频繁地被查找,所以如果你总是将最近引用的东西移到列表的头部,你更有可能更快地找到它。如果项目被统一引用,这种优化没有任何好处。

通过链接,您通常可以在 150% 或 200% 的负载因子下获得良好的性能;有时甚至更高。与重新散列形成对比,重新散列在负载因子或 70% 或 75% 时开始快速降级。