Data structures 计算哈希表项的空间消耗时负载因子的作用

Data structures 计算哈希表项的空间消耗时负载因子的作用,data-structures,hash,Data Structures,Hash,我正在读这篇文章,我不明白这句看似简单的话: 对于哈希表,所需的额外内存量取决于 表的组织和荷载系数(其定义也相同) 取决于组织)。最简单的例子是组织 称为开放寻址,其中所有条目都存储在一个 随机存取表。[…]在这种情况下,每个条目使用的内存量为M/α *M是键和相关值所需的字节数,α是负载因子 为什么是M/α?为什么不是简单的M+(每个存储桶的内存量*总存储桶)?在开放寻址中,元素分布在一个固定大小的插槽阵列中。这只是一个普通数组,其中包含元素空间和(可选)一些控制位,用于标记哪些插槽已满,哪

我正在读这篇文章,我不明白这句看似简单的话:

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

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


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

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

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

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