【发布时间】:2010-09-22 02:41:44
【问题描述】:
如果我有一个 1000 的键集,我的哈希表的合适大小是多少,这是如何确定的?
【问题讨论】:
-
大于 1000X2 的素数将是合适的。
如果我有一个 1000 的键集,我的哈希表的合适大小是多少,这是如何确定的?
【问题讨论】:
我想重申上面https://stackoverflow.com/users/33229/wwwflickrcomphotosrene-germany 所说的话。 1000 对我来说似乎不是一个很大的哈希值。我一直在 java 中使用很多这种大小的哈希表,但没有看到太多的性能问题。而且我几乎从不关心尺寸或负载系数。
如果您对代码运行了分析器并确定哈希表是您的问题,那么请务必开始调整。否则,在你确定之前,我不会认为你有问题。
毕竟,在大多数代码中,性能问题并不是您认为的问题。我尽量不去预测。
【讨论】:
让它成长。有了这个尺寸,自动处理就很好了。除此之外,2 x size + 1 是一个简单的公式。素数也不错,但是一旦您的数据集达到一定大小,散列实现可能会决定重新散列并扩大表。
您的密钥正在提高效率,并且希望足够独特。
底线:当您遇到尺寸或性能缓慢等问题时,请询问尺寸问题,除此之外:别担心!
【讨论】:
两次就好了。
你没有一个大的键集。 不要为关于 HashTable 实现的艰难讨论而烦恼,去 2000 年吧。
【讨论】:
这取决于负载因子(表格将增加其大小并重新分配其元素的“百分比满”点)。如果您知道您正好有 1000 个条目,并且这个数字永远不会改变,您可以将负载因子设置为 1.0 并将初始大小设置为 1000 以获得最大效率。如果您不确定确切的大小,您可以将负载因子保留为默认值 0.75,并将初始大小设置为 1334(预期大小/LF),以获得真正良好的性能,但需要付出一定的代价额外的内存。
您可以使用以下构造函数来设置负载因子:
Hashtable(int initialCapacity, float loadFactor)
【讨论】:
您还需要考虑哈希函数。
一个经验法则建议将表格大小增加一倍,以便有扩展空间,并希望保持较小的冲突数量。
另一个经验法则是假设您正在执行某种与模数相关的散列,然后将表大小四舍五入到下一个最大的素数,并使用该素数作为模值。
你在散列什么样的东西?更多细节应该会产生更好的建议。
【讨论】:
Hashtable 的文档中对这些因素进行了一些讨论
【讨论】: