【问题标题】:Role of load factor when calculating space consumption of a hash table entry计算哈希表条目的空间消耗时负载因子的作用
【发布时间】:2016-10-20 13:09:44
【问题描述】:

我在看"Rationale for Adding Hash Tables to the C++ Standard Template Library"的文章,看不懂这个看似简单的说法:

对于哈希表,所需的额外内存量取决于 表格的组织和负载因子(其定义也 取决于组织)。最简单的情况是组织 称为开放寻址,其中所有条目都存储在单个 随机存取表。 [...] 在这种情况下,每个条目使用的内存量是 M/α。

*M 是键和关联值所需的字节数,α 是负载因子。

为什么是 M/α?为什么不是简单的 M+(每个桶的内存量 * 总桶数)?

【问题讨论】:

    标签: data-structures hash


    【解决方案1】:

    在开放式寻址中,您有一个固定大小的插槽数组,元素分布在其中。这只是一个普通数组,其中包含元素空间和(可选)一些控制位,以标记哪些槽已满,哪些槽为空。

    假设我们有一个带有 s 个槽的表,并且我们想要将 n 个元素分配到表中。这意味着 α = n / s,元素数除以槽数。那么整个表的空间使用量就是sM,因为有s个slots,每个slots使用M个字节。因此,如果我们要计算每个元素使用的内存,我们要​​计算 sM / n = M / (n / s) = M / α,这就是公式的来源。直觉上,这是有道理的。如果表中有单个元素,则加载因子为 1 / s,因此总内存 (Ms) 除以元素数 (1) 为 Ms。另一方面,如果表已满载 ( n = s),则 α = 1,总内存 (Ms) 除以元素数 (s) 等于 M。

    通过查看每个存储桶的内存量并将其乘以存储桶的数量,您的计算是正确的。如果将 M 视为每个元素的大小,将 s 视为槽数,则最终会得到 Ms 的总空间使用量。(无需添加 M 项,这样做实际上会给出错误的单位:M有单位“每个元素的字节数”,而 Ms 有单位“字节”,所以它们不应该加在一起)。

    【讨论】:

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