我正在阅读文章"Rationale for Adding Hash Tables to the C++ Standard Template Library",我不明白这个看似简单的陈述:
使用哈希表,所需的额外内存量取决于 表的组织和负载因子(也是 取决于组织)。最简单的情况是组织 称为开放寻址,其中所有条目都存储在一个中 随机访问表。 [...]在这种情况下,每个条目使用的内存量是M /α。
* M是密钥和关联值所需的字节数,α是负载系数。
为什么是M /α?为什么不是简单的M +(每个桶的总内存量*总桶数)?
答案 0 :(得分:1)
在开放式寻址中,您有一个固定大小的插槽阵列,元素分布在这些插槽中。这只是一个普通的数组,带有元素空间和(可选)一些控制位,用于标记哪些插槽已满,哪些空为空。
假设我们有一个带有s个槽的表,我们希望将n个元素分配到表中。这意味着α= n / s,元素数除以时隙数。然后整个表的空间使用是sM,因为有s个槽,每个槽使用M个字节。因此,如果我们想要计算每个元素使用的内存,我们想要计算sM / n = M /(n / s)= M /α,这是公式的来源。直觉上,这是有道理的。如果表中有一个单独的元素,则加载因子为1 / s,因此总内存(Ms)除以元素数(1)就是Ms.另一方面,如果表是满载的( n = s),则α= 1,总存储器(Ms)除以元素数(s)等于M.
通过查看每个存储区的内存量并将其乘以存储区数量,您在计算中处于正确的轨道上。如果将M视为每个元素的大小而将s视为插槽的数量,则最终会占用Ms的总空间(不需要添加M项,这样做实际上会给出错误的单位:M单位为“每个元素的字节数”,Ms的单位为“字节”,因此不应将它们加在一起。)