我在接受采访时被问到一个非常好的问题。问题是 -
我们知道,如果hashmap条目达到loadfactor,则会发生重新散列。例如 - 如果我的loadfactor为7且我的mapsize为9,那么当没有时,将进行重新散列。条目达到7。
现在的问题是假设我想在这个地图中只输入8个元素(而且我们知道我将loadfactor保持为7)然后当我输入第7个元素时,将进行重新格式化。所以我只是想在第7个元素之后再添加一个元素,但是重新发生并且不必要地增加了大小并导致不必要的内存浪费。 那么为什么我不将loadfactor大小保持为等于初始容量。为什么它保持在75%或80%或类似的东西。
提前感谢您的回答。
答案 0 :(得分:1)
“那么为什么我不将负载系数大小保持为等于初始容量。为什么它保持在75%或80%或类似的东西。”
hashmap代码无法预测您将在地图中插入多少元素。尝试做的是减少内存重新分配操作的频率。超出负载因子时的扩展是一种简单(且有效)的策略,它将时间复杂度保持在较低水平,即最坏情况下realloc的O(log(n))倍。
<强>更新强>
加载因子是新插入元素与已加载元素冲突的可能性的指示符,也就是说,加载的hashmap越多,新元素碰撞的可能性越大,意味着元素的hashkey相等,将导致目标存储桶中更长的喜欢列表,从而降低效率。加载因子试图阻止hashmap变为几个长链表,这对于插入或删除操作来说不是o(1)。
答案 1 :(得分:1)
在这种情况下,负载系数不是7而是7/9。你问为什么它小于1,因为这意味着一些内存浪费在空桶上。答案是它通过增加在桶之间均匀分配项目的可能性来加速插入和删除。如果负载系数小于1且具有良好的散列函数,则每个存储桶通常只有1个项目 - 低或无碰撞。