我正在读"Rationale for Adding Hash Tables to the C++ Standard Template Library"一篇文章,我不明白这个看似简单的说法:
对于哈希表,所需的额外内存量取决于表的组织和负载因子(其退出也取决于组织)。最简单的情况是称为开放寻址的组织,其中所有条目都存储在一个随机访问表中。..。在这种情况下,每个条目使用的内存量是M/α。
*M是键和相关值所需的字节数,α是加载因子。
为什么是M/α?为什么不是简单的M+(每个桶*总桶的内存量)?
发布于 2016-06-19 00:51:09
在开放寻址中,您有一个固定大小的插槽数组,将元素分配到其中.这只是一个普通的数组,有元素的空间和(可选的)一些控制位,用来标记哪些插槽是满的,哪些是空的。
假设我们有一个带有s槽的表,并且我们希望将n个元素分配到表中。这意味着α=n/ s,元素数除以槽数。然后整个表的空间使用是sM,因为有s个插槽,每个插槽使用M字节。因此,如果我们想计算每个元素使用的内存,我们要计算sM /n=M/ (n / s) =M/α,这是公式的来源。从直觉上讲,这是有道理的。如果表中有单个元素,负载因子为1/s,而总内存( Ms )除以元素数(1),则另一方面,如果表已满载(n = s),则α=1,总内存(Ms)除以元素数等于M。
通过查看每个桶的内存量并将其乘以桶的数量,您的计算就处于正确的轨道上。如果将M视为每个元素的大小,而s作为插槽的数目,则最终得到了Ms的总空间使用量(没有必要在其中添加M项,这样做实际上给出了错误的单位:M有单元“每个元素”,Ms有单位“字节”,因此不应该将它们加在一起)。
https://stackoverflow.com/questions/37902858
复制相似问题