【问题标题】:Lower / upper load factor in hash tables哈希表中的低/高负载因子
【发布时间】:2014-05-02 19:43:36
【问题描述】:

我要在java中写一个链式哈希集类。

我知道负载因子是 M/容量,其中 M 是表中当前元素的数量,容量是表的大小。

但是负载因子如何帮助我确定是否应该调整表格大小并重新散列? 我也找不到任何地方如何计算下/上负载因子。他们甚至需要吗?

我希望这是足够的信息, 谢谢!!

【问题讨论】:

  • 一个问题不清楚。 JDK HashMap 确实在 loadFactor = 0.75 处重新散列。
  • 我正在尝试构建自己的哈希集。

标签: java hashtable load-factor


【解决方案1】:

单个loadFactor 用于配置标准Java 哈希(以及其他语言的许多哈希API)是一种简化。

从概念上来说,区分是合理的

  • 目标负载,表示默认内存占用——性能权衡配置。当您构建已知大小的哈希时,您选择容量,以便大小/容量尽可能接近目标负载。

  • 最大负载,您希望哈希值永远不会超过此负载。如果哈希达到此负载,则触发调整大小。

  • 增长因子,在调整大小时将散列放大多少的默认配置。如果容量是 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)。

【讨论】:

    【解决方案2】:

    反之亦然:不是负载系​​数对您有帮助;您明确根据您的性能测试来决定负载因子,以避免浪费时间重新散列并且仍然具有可接受的检索和迭代性能。

    【讨论】:

    • 所以我决定了负载系数。如果 m/容量较低或较高,我重新哈希但相应地更改表大小?并且桌子大小也需要是素数吗?
    • @k20 表大小可以任意,但通常取2的倍数来加快桶索引的计算
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2013-11-30
    • 2015-08-13
    • 2017-04-26
    • 2013-06-18
    • 2013-04-03
    • 2020-08-13
    相关资源
    最近更新 更多