哈希映射或哈希表中的重新哈希处理

2022-09-02 11:33:47

当大小超过最大阈值时,如何在哈希映射或哈希表中完成重新哈希处理过程?

是否所有对都只是复制到新的存储桶数组?

编辑:

重新哈希后,同一存储桶(在链接列表中)中的元素会发生什么情况?我的意思是,在重新哈希之后,它们会留在同一桶中吗?


答案 1

问题中的最大阈值称为负载因子。

建议负载系数在0.75左右。负载因子定义为 (m/n),其中 n 是哈希表的总大小,m 是首选的条目数,在需要增加基础数据结构的大小之前,可以插入这些条目。

在两种情况下可以执行重新哈希处理:

  1. 当当前的 m'/n 比率增加超过负载系数时

  2. M'/n比率下降到一个非常低的值,比如0.1

在这两种情况下,m' 都是当前条目数。此外,这两种情况都要求将当前条目移动到更大或更小的哈希表中。

在问题的上下文中,重新哈希是将哈希函数应用于条目以将其移动到另一个哈希表的过程。可以使用之前使用的哈希函数或完全使用新函数。

请注意:发生碰撞时也会进行重新哈希处理。(这也是处理碰撞的一种方式。

要添加更多上下文和详细讨论,请访问我的博客Hashing Basics


答案 2

当映射中的元素数达到最大阈值时,将重新哈希映射。

通常负载因子值为 0.75,默认初始容量值为 16。一旦元素数量达到或超过容量的0.75倍,就会重新哈希映射。在这种情况下,当元素数为 12 时,将发生重述。(0.75 * 16 = 12)

当发生重新哈希时,可以使用新的哈希函数甚至相同的哈希函数,但存在值的存储桶可能会更改。基本上,当发生重新哈希时,存储桶的数量大约翻了一番,因此必须放置值的新索引会发生变化。

在重新哈希时,每个存储桶的链接列表将按顺序反转。发生这种情况是因为HashMap不会在尾部追加新元素,而是在头部追加新元素。因此,当发生重新哈希时,它会读取每个元素并将其插入到头部的新存储桶中,然后继续在新地图的头部从旧地图中添加下一个元素,从而导致链表的反转。

如果有多个线程处理相同的哈希映射,则可能导致无限循环。

在上述情况下,无限循环如何发生的详细解释可以在这里找到:http://mailinator.blogspot.hu/2009/06/beautiful-race-condition.html

如果插入到地图中的元素必须根据键进行排序,则可以使用树状图。但是,如果键的顺序无关紧要,HashMap会更有效率。