哈希 Table 与链接(Table 加倍)

Hash Table with Chaining (Table Doubling)

  1. 当所有项散列到同一个槽(一个巨大的 LinkedList)时,如何使用链接修复散列 Table?
  2. Hash Table with Chaining 是否使用 Table 加倍?如果是这样,什么时候是将 Table.
  3. 的大小加倍的好时机

扩展 NikiC 评论的答案:

对于您的第一个问题,不幸的是,在实现链式哈希 table 时,这是一种真实的可能性。假设您有一个很好的散列函数——或者更好的是,通过选择一个涉及某些随机元素的散列函数——这是极不可能的。不幸的是,坏人有时会用它来破坏网络服务器。不久前,开发了一种称为 "Hash DoS" 的攻击,有人可以借此向 Web 服务器发出一堆专门的请求,这会导致所有内容都存储在链式哈希 table 中的同一个槽中,这导致性能大幅下降,并最终导致一些网站离线。不过,好消息是许多编程语言的实现已经更新,因此它们的散列 table 不会受到此类攻击的影响。

对于你的第二个问题,答案是 "it depends." 当负载因子变得太高时(通常,负载因子在 1 和 2 之间),链式哈希 table 的大多数好的实现都会重新哈希并增长是常见的)。但是,有些实现没有。例如,我认为 Java 中的 ConcurrentHashMap 实现不会进行任何重新散列,因为当许多读取和写入并发执行时这样做是不可行的。

在散列table的每个位置,添加一个二级数​​据结构,例如二叉树或另一个散列table。

例如,如果多个值被散列到第一个散列 table 中的相同位置,那么将它们放入二叉树中该位置将使您 search/insert 在 O( lg n) 时间而不是链表的 O(n) 时间。

如果您想使用另一个散列 table,则需要对第一个散列 table 中位于相同位置的值应用不同的散列函数。在第二次散列之后,值将落在第二个散列中 table 希望在不同的位置。