我正在研究算法类的哈希表,我对负载因子感到困惑。 为什么负载系数n / m对于' n'是元素的数量和' m'表格槽数是多少? 另外,为什么这个加载因子等于n(j)的预期长度,当所有元素都存储在一个插槽中时,哈希表中插槽j的链表?
答案 0 :(得分:3)
哈希表的关键属性是查找元素所需的预期常量时间。*
为了实现这一点,哈希表的实现者必须确保哈希表的每个查询都返回到一些 fixed 步数以下。
如果您有一个带有m
存储桶的哈希表并且无限期地添加元素(即n>>m
),那么列表的大小也会增加,并且您无法保证预期的预定时间查找,但你宁愿得到线性时间(因为你需要遍历不断增加的链表的运行时间将超过桶的查找)。
那么,我们怎样才能实现列表不会增长?那么,你必须确保列表的长度受到一些固定常量的限制 - 我们如何做到这一点?好吧,我们必须添加额外的桶。
如果哈希表得到很好的实现,那么用于将元素映射到桶的哈希函数应该将元素均匀地分布到桶中。如果散列函数执行此操作,那么列表的长度将大致相同。
如果元素均匀分布,其中一个列表有多长?显然,我们将元素总数除以桶数,即加载因子 n/m
(元素数每桶=预期/平均长度每个清单)。
因此,为了确保持续的时间查找,我们要做的是跟踪负载因子(再次:列表的预期长度),以便当它超过固定常量时我们可以添加额外的桶。
当然,还有更多问题,例如如何重新分发已存储的元素或添加多少桶。
要带走的重要信息是,需要加载因子来决定何时向哈希表添加额外的桶 - 这就是为什么它不仅“重要”而且至关重要
当然,如果您将所有元素映射到同一个存储桶,那么每个列表的平均长度将不会太多。如果你在桶中均匀分配,那么这些东西才有意义。
*注意预期的 - 我不能强调这一点。它通常听到“哈希表有不断的查找时间”。他们不!最坏的情况总是O(n),你不能让它消失。
答案 1 :(得分:0)
添加现有答案,让我简单介绍一下。
考虑表中任意选择的桶。如果将X_i
元素插入此元素,则1
为等于ith
的指标随机变量,否则为0
。
我们希望找到E[X_1 + X_2 + ... + X_n].
通过期望的线性,这等于E[X_1] + E[X_2] + ... E[X_n]
现在我们需要找到E[X_i].
的值,这只是预期值定义的(1/m) 1 + (1 - (1/m) 0) = 1/m
。因此,总结所有i's
的值,我们得到1/m + 1/m + 1/m
n
次。这等于n/m.
我们刚刚发现插入随机存储区的预期元素数量,这是负载因素。