【问题标题】:Load factor with chained Hash Set链式哈希集的负载因子
【发布时间】:2013-04-12 14:46:19
【问题描述】:

我被分配去实现一个链式哈希集:

该集合由一个链接列表数组支持(我称之为A[]),如果两个不同的值得到相同的哈希值k,它们将被添加到列表A[k]

结构在有限的负载因子下工作正常(在区间[0.25, 0.75])。

在他们告诉我们计算负载因子的说明中:

负载系数 = 大小/容量

其中“size”是当前集合中的元素总数,“capacity”是数组的长度 (A.length)。

我认为这种“大小”的定义在这种情况下是不合适的,应该是A中使用列表的数量。

例如,如果所有值都映射到同一个单元格,比如A[1],那么在根据负载因子重新散列时,我们将使后面的数组A 更大,而实际上只使用第一个单元格。

有人看到我的逻辑有什么错误吗?

【问题讨论】:

    标签: data-structures hashset


    【解决方案1】:

    哈希通常被修改为转换为数组索引,因此,当增加数组的大小时,元素很可能不会再次出现在同一个链表中(至少它们不应该如果您使用适当的哈希函数)。

    此外,负载系数的含义也会发生相当大的变化。正如它所定义的那样,它将给出链接列表中项目的平均数量的一些指示,这是一个非常重要的数字,因为这是检索一个项目需要(平均)多长时间。

    无论好坏,哈希表都依赖于适当的哈希分布,因此假设一个列表与其他列表相比不会变得太大。

    存储用于指示散列函数质量的索引数量也很有意义,但我认为没有多大意义。 API 对此无能为力(因为它不处理散列函数,它只是调用它)。如果使用错误的哈希函数,在调用代码中动态更改哈希函数似乎不太实用。

    【讨论】:

    • 感谢您的回答。我没有想到这些角度。
    【解决方案2】:

    例如,如果所有值都映射到同一个单元格,比如 A[1],那么在根据负载因子重新散列时,我们将使后面的数组 A 更大,而实际上只使用第一个单元格。

    我认为一个隐含的假设是你使用了一个好的散列函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2019-04-14
      • 2013-11-30
      • 2015-08-13
      • 2017-04-26
      • 2013-06-18
      • 1970-01-01
      相关资源
      最近更新 更多