我要在java中编写一个链式哈希集类。
我理解负载系数是M /容量,其中M是表中当前元素的数量,容量是表的大小。
但是负载因子如何帮助我确定是否应该调整表格并重新调整? 此外,我无法找到任何地方如何计算下/上负载因子。他们甚至需要吗?
我希望这是足够的信息, 谢谢!!
答案 0 :(得分:1)
用于配置标准Java哈希(以及其他语言中的多个哈希API)的单个loadFactor
是一种简化。
从概念上讲,distingush是合理的
目标负载,表示默认的内存占用 - 性能权衡配置。当您构建已知大小的哈希时,您可以选择容量,以便大小/容量尽可能接近目标负载。
最大负载,您希望哈希永远不会超过此负载。如果哈希达到此负载,则触发调整大小。
增长因子,这是在调整大小时放大哈希值的默认配置。如果容量是2的幂,则增长因子可能只有2或4。
最小负载,您希望散列加载永远不会低于最小负载,可能除非您删除元素或清除哈希。如果容量是2的幂,则最小负载不能大于0.5。此外,最大载荷/最小载荷比应大于或等于生长因子。
以上所有关注链接哈希,对于使用墓碑的开放式寻址哈希事情变得更加复杂。
在java.util.HashMap
loadFactor
中同时扮演目标和最大加载的角色。增长系数为2,最小负载为0.0。
对于链式散列非2次幂容量是过度杀伤,除非你需要极其精确控制内存使用(你不要相信我)或2 ^ 30之间的容量和2 ^ 31-1(因为你不能在Java中创建一个大小为2 ^ 31的数组,它是Integer.MAX_VALUE
+ 1)。
答案 1 :(得分:0)
它反过来说:它并不是负载因素对你有帮助;您明确根据您的性能测试确定负载因子,以避免浪费时间重新散列并仍具有可接受的检索和迭代性能。