Java 为哈希选择合适的表大小

Java 为哈希选择合适的表大小,java,hash,hashtable,Java,Hash,Hashtable,如果密钥集为1000,那么哈希表的合适大小是多少?如何确定?文档中对这些因素进行了一些讨论,您也需要考虑哈希函数 一条经验法则建议将表的大小增加一倍,这样就有了扩展的空间,并希望保持较小的碰撞次数 另一个经验法则是假设您正在进行某种与模相关的哈希运算,然后将表大小四舍五入到下一个最大的素数,并使用该素数作为模值 你在讨论什么?更详细的信息会产生更好的建议。这取决于负载系数(表格将增加其大小并重新分配其元素的“满百分比”点)。如果您知道您正好有1000个条目,并且这个数字永远不会改变,那么您可以将

如果密钥集为1000,那么哈希表的合适大小是多少?如何确定?

文档中对这些因素进行了一些讨论,您也需要考虑哈希函数

一条经验法则建议将表的大小增加一倍,这样就有了扩展的空间,并希望保持较小的碰撞次数

另一个经验法则是假设您正在进行某种与模相关的哈希运算,然后将表大小四舍五入到下一个最大的素数,并使用该素数作为模值


你在讨论什么?更详细的信息会产生更好的建议。

这取决于负载系数(表格将增加其大小并重新分配其元素的“满百分比”点)。如果您知道您正好有1000个条目,并且这个数字永远不会改变,那么您可以将负载系数设置为1.0,将初始大小设置为1000,以获得最大效率。如果您不确定确切的大小,您可以将负载系数保留为默认值0.75,并将初始大小设置为1334(预期大小/LF),以获得真正良好的性能,但需要额外的内存

可以使用以下构造函数设置负载系数:

Hashtable(int initialCapacity, float loadFactor) 
两次是好的

你没有一个大的键集。
不要为关于哈希表实现的困难讨论而烦恼,开始2000年吧。

让它成长吧。有了这个尺寸,自动处理就可以了。除此之外,2 x大小+1是一个简单的公式。素数也是一种好方法,但一旦数据集达到一定大小,哈希实现可能会决定重新刷新和增长表

你的关键是推动有效性,并希望足够清晰


底线:当您遇到尺寸或性能缓慢等问题时,请询问尺寸问题,除此之外:不要担心

我想重申上述内容。1000对我来说似乎不是个大杂烩。我已经在java中使用了很多这样大小的哈希表,但没有看到太多的性能问题。而且我几乎从不考虑尺寸或负载系数

如果您已经在代码上运行了探查器,并确定哈希表是您的问题,那么请务必开始调整。否则,在你确定之前,我不会认为你有问题


毕竟,在大多数代码中,性能问题并不在您认为的地方。我尽量不去预测。

假设哈希函数在一组预期的键上表现良好。自制的哈希函数在最小大小的表中可能表现不好。对于自制函数,您必须运行实验。如果哈希函数表现不好,冲突元素将存储在同一个存储桶中(在LinkedList中)。最小尺寸的桌子对性能没有任何影响。如果这方面的性能成为问题,请担心。如果你试图提前处理它,你很可能会插入一个bug,或者只是有不必要的复杂代码,这可能会导致维护问题。我同意。先解决问题,然后再寻找解决方案。2000不是一个好的尺寸,因为它不是质数。2001年会很好,它不是最好的,但至少不是最好的。将更好地分配表中的键。一个好的哈希表将处理好一个好的哈希函数,但大多数情况下,使用的是大小。这是一个有趣的问题。如果您使用的散列键类型为:H(s)=s[0]+b*s[1]+b^2s[2]+。。。[N] 我认为今天的行业标准是使用2^k作为大小和更好的散列函数,比如Jenkins。上一次我检查std是否与素数一起工作。这与其说是答案,不如说是评论。大于1000X2的素数比较合适。