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