为什么哈希表插入时间复杂度最坏的情况不是N log N

时间:2019-07-07 17:50:41

标签: time-complexity hashtable

查看哈希表的基本结构。我们知道它会调整WRT负载因子或其他确定性参数的大小。我得到的是,如果在插入内达到调整大小的限制,我们需要创建一个更大的哈希表并将所有内容插入在那里。这是我不明白的东西。

让我们考虑一个哈希表,其中每个存储桶都包含一个AVL-平衡BST。如果我的哈希函数为每个键返回相同的索引,那么我会将所有内容存储在同一AVL树中。我知道此哈希函数将是一个非常糟糕的函数,将不会使用,但是我在这里做最坏的情况。因此,经过一段时间后,我们可以说已达到调整大小的因素。因此,为了调整大小,我创建了一个新的哈希表,并尝试在以前的表中插入每个旧元素。由于哈希函数将所有内容映射回一个AVL树,因此我需要将所有N个元素插入同一AVL中。 AVL树上的N个插入为N logN。那么为什么将插入哈希表的最坏情况视为O(N)呢?

以下是将N个元素添加到Avl中的证明,三个是N logN: Running time of adding N elements into an empty AVL tree

1 个答案:

答案 0 :(得分:1)

简而言之:这取决于存储桶的实现方式。使用链接列表,可以在特定条件下在 O(n)中完成。对于以AVL树作为存储桶的实现,在大多数情况下,这确实可能导致 O(n log n)。为了计算时间复杂度,应该知道存储桶的实现。

通常,不是用AVL树或一般的树来实现存储桶,而是通过链表实现。如果引用了列表的last条目,则可以在 O(1)中进行附加。否则,我们仍然可以通过在链表之前添加 O(1)(在这种情况下,存储桶以相反的插入顺序存储数据)。

使用链表的想法是,使用合理的哈希函数的字典应该不会造成任何冲突。通常,一个存储桶有零个或一个元素,有时有两个或三个,但不多。在这种情况下,简单的数据结构可能会更快,因为简单的数据结构通常每次迭代所需的周期更少。

某些哈希表使用开放式寻址,其中存储桶不是分离的数据结构,但是如果存储桶已被占用,则使用下一个空闲存储桶。在这种情况下,搜索将遍历已用过的存储桶,直到找到匹配的条目,或者到达空的存储桶为止。

Wikipedia article on Hash tables讨论了如何实现存储桶。