【发布时间】:2015-08-03 15:43:21
【问题描述】:
检查 java 并在线搜索哈希表代码示例,似乎调整表的大小是通过将其加倍来完成的。
但大多数教科书说,表格的最佳大小是素数。
所以我的问题是:
是加倍的方法,因为:
- 很容易实现,或者
- 寻找素数效率太低(但我认为寻找
下一个素数超过
n+=2并使用测试素数 模是 O(loglogN),这很便宜) - 或者这是我的误解,只有某些哈希表变体 只需要素数表大小?
更新:
教科书中使用素数的方式是某些属性起作用所必需的(例如,二次探测需要一个素数大小的表格来证明,例如,如果表格不完整,则将插入项目 X)。
作为重复发布的链接通常询问有关增加任何数字的问题,例如25% 或下一个质数,并且接受的答案表明我们加倍以保持调整大小操作“罕见”,因此我们可以保证摊销时间。
这并不能回答让表大小为素数并使用素数来调整大小甚至大于两倍的问题。所以我们的想法是在考虑调整大小开销的情况下保持素数大小的属性
【问题讨论】:
-
stackoverflow.com/a/1147232/1076640 也有很好的讨论。特别关注包含“所以你依赖散列函数而不使用偶数乘数”的部分。
-
表格大小为 2 的幂时的查找速度更快,因为余数可以使用位掩码完成,但这更像是一种微优化。
-
而且java的哈希表是作为外链实现的,所以没有问题。我没有关注这个问题。
-
我们应该记住的是,内置的 Java 集合都是基于某种程度的折衷:它们必须相当好地适用于极其广泛的使用模式。在应用程序中,您可以使用更适合您的特定用例的算法重新实现集合,但代价是在其他情况下表现更差。这是很多人所做的。
标签: java performance algorithm data-structures hashtable