1

我在一次采访中被问到一个非常好的问题。问题是——

我们知道,如果 hashmap 条目达到 loadfactor ,就会发生重新散列。例如 - 如果我的负载因子是 7 并且我的 mapsize 是 9,那么当不是时会发生重新散列。条目数达到 7 。

现在的问题是假设我想在这张地图中只输入 8 个元素(并且我们知道我将负载因子保持为 7),那么当我输入第 7 个元素时,就会发生重新散列。所以我只想在第 7 个元素之后再添加一个元素,但是重新散列并且不必要地增加了大小并造成了不必要的内存浪费。那么为什么我不保持 loadfactor size 等于 initial capacity 。为什么它保持在 75% 或 80% 之类的。

提前感谢您的回答。

4

2 回答 2

1

“那我为什么不让负载因子大小等于初始容量。为什么它保持在 75% 或 80% 或类似的值。”

hashmap 代码无法预测您将在地图中插入多少元素。它试图做的是减少内存重新分配操作的频率。超过负载因子时进行扩展是一种简单(且有效)的策略,它可以保持较低的时间复杂度,在最坏的情况下是重新分配的 O(log(n)) 次。

更新

加载因子是新插入的元素与已经加载的元素碰撞的可能性的一个指标,也就是说,你的hashmap加载的越多,新元素碰撞的可能性就越大,意味着元素的hashkey相等,这将导致目标桶中的喜欢列表更长,从而降低效率。加载因子尽量防止hashmap退化为几个长链表,这对于插入或删除操作来说不是o(1)。

于 2013-08-25T05:53:08.837 回答
1

在这种情况下,负载因子不是 7,而是 7/9。您在问为什么它小于 1,因为这意味着在空桶上浪费了一些内存。答案是它通过增加跨桶均匀分布项目的可能性来加速插入和删除。负载因子小于 1 和良好的散列函数通常每个桶只有 1 个项目 - 低冲突或没有冲突。

于 2013-08-25T14:49:26.313 回答