带链接的哈希表(表加倍)

时间:2015-10-02 20:30:48

标签: algorithm data-structures hashtable chaining

  1. 当所有Items都哈希到同一个插槽(一个巨大的LinkedList)时,如何使用Chaining修复哈希表?
  2. 带链接的哈希表是否使用表加倍?如果是这样的话,什么时候才能把桌子的大小翻倍。

2 个答案:

答案 0 :(得分:2)

扩展NikiC评论的答案:

对于您的第一个问题,遗憾的是,在实现链式哈希表时,这是一个真正的可能性。假设你有一个很好的哈希函数 - 或者更好的是,通过选择涉及一些随机元素的哈希函数 - 这是极不可能的。不幸的是,Bad People有时会使用它来删除Web服务器。不久前,开发了一种名为“Hash DoS”的攻击,有人会向Web服务器制作一堆专门的请求,这些请求会导致所有内容存储在链式哈希表的同一个插槽中,从而带来巨大的性能滴,并最终使一些网站脱机。然而,好消息是许多编程语言实现已经更新,因此他们的哈希表不容易受到这样的攻击。<​​/ p>

对于你的第二个问题,答案是“这取决于”。当负载因子过高时,链接哈希表的大多数良好实现会重新散列并增长(通常,1和2之间的负载因子很常见)。但是,有些实现没有。例如,我相信Java中的ConcurrentHashMap实现不会进行任何重复操作,因为当许多读写操作同时执行时,这样做是不可行的。

答案 1 :(得分:1)

在哈希表的每个位置,添加辅助数据结构,例如二叉树或其他哈希表。

例如,如果多个值被散列到第一个哈希表中的相同位置,那么将它们放在该位置的二叉树中将允许您在O(lg n)时间内搜索/插入它们而不是O (n)链接列表的时间。

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

相关问题