如果我有一个1000的密钥集,我的哈希表的合适大小是什么,以及这是如何确定的?为哈希选择合适的表大小
回答
它取决于加载因子(表格将增加其大小并重新分配其元素的“完整百分比”点)。如果您知道您有1000个条目,并且该数字永远不会更改,您可以将负载因子设置为1.0,并将初始大小设置为1000以获得最大效率。如果您不确定具体的尺寸,则可以将载入系数保留为其默认值0.75,并将初始尺寸设置为1334(预计尺寸/ LF),这对于真正的性能良好,但需要额外的内存。
您可以使用下面的构造函数来设置负载系数:
Hashtable(int initialCapacity, float loadFactor)
这些因素的文档中的一些讨论,你需要在散列函数因素为好。
一条经验法则建议将表格大小增加一倍,以便有扩展空间,并希望保持较小的碰撞次数。
另一个经验法则是假设你正在进行某种与模相关的散列,然后将你的表大小舍入到下一个最大的素数,然后使用该素数作为模数值。
你有什么样的哈希?更多细节应该产生更好的建议。
两次是好的。
您没有大的键组。 不要担心有关您的HashTable实施的困难讨论,并去2000年。
2000并不是一个好的尺寸,因为它不是素数。 2001年会很好,这不是主要的,但至少不会。将表中的密钥分配得更好。一个好的散列表会照顾好散列函数,但大多数情况下都会使用这个散列表的大小。 – ReneS 2008-11-14 19:21:34
让它成长。有了这个尺寸,自动处理就好了。除此之外,2 x大小+ 1是一个简单的公式。素数也是一种很好的方式,但只要您的数据集达到一定的大小,哈希实现可能会决定重新哈希和增长表。
你的钥匙正在推动有效性,并希望有足够的分明。
底线:如果您遇到问题(例如尺寸或性能下降),请询问尺寸问题,除此之外:别担心!
我想重申一下上面说的https://stackoverflow.com/users/33229/wwwflickrcomphotosrene-germany。 1000对我来说似乎不是一个非常大的散列。我一直在java中使用大量有关这种大小的哈希表,而没有看到很多性能问题。而且我几乎不知道大小或负载系数。
如果你已经在你的代码上运行一个分析器并确定哈希表是你的问题,那么通过一切手段开始调整。否则,在你确定之前,我不会认为你有问题。
毕竟,在大多数代码中,性能问题不在您认为的地方。我尽量不要预期。
- 1. 哈希表大小设置
- 2. SAS哈希合并 - 小数据集作为哈希对象
- 3. Perl哈希阵列大小
- 4. 哈希字符串大小
- 5. 获取合适的哈希索引C++
- 6. python,哈希函数选择
- 7. Ruby集合哈希集合中的选择性值
- 8. 哪种哈希算法最适合HMAC
- 9. 哈希表:为什么大小应该是素数?
- 10. 什么是MongoDB哈希的大小?
- 11. 哈希合并行为
- 12. 如何在Python中生成混合大小写的哈希?
- 13. 选择最合适的整数大小/范围用于变量
- 14. 哈希函数和表格的大小表格2^p
- 15. 使TCL哈希不区分大小写
- 16. 如何计算SHA-256哈希大小
- 17. pbkdf2 sha512密码哈希大小
- 18. 哈希表vs哈希列表与哈希树?
- 19. 哈希表中的搜索哈希
- 20. 如何实现动态大小的哈希表?
- 21. 修复了高速缓存的哈希表大小
- 22. 如何创建不区分大小写的Glib哈希表?
- 23. C#创建一个固定大小的哈希表
- 24. 如何制作灵活大小的哈希表
- 25. 调整哈希表的大小有意义吗?什么时候?
- 26. 哈希表大小取决于密钥的长度?
- 27. 合并哈希键
- 28. Clojure的合并在哈希表键值
- 29. 的UITableViewCell大小不合适
- 30. 适合JButton ImageIcon的大小
假设散列函数在期望的键集上表现良好。家庭酿造的散列函数在最小尺寸的表中可能表现不佳。对于家庭酿造的功能,您必须运行实验。 – 2008-11-13 03:07:03
如果散列函数没有良好的行为,碰撞元素将被存储在同一个桶中(在LinkedList中)。桌子最小尺寸对性能没有任何影响。 – 2008-11-13 03:12:33