假设哈希表槽(例如n)的数量与表中的元素数量(例如m)成比例。我们有n = O(m), 载荷系数l = O(m)/ m = O(1) 因此,在简单统一哈希的假设下,搜索平均需要一段时间。这意味着平均搜索需要与链表长度成比例的时间,这对于所有时隙都是相同的,因此是恒定时间。但是在简单统一散列的假设下,最糟糕的情况下运行时间如何呢?它也是常数还是O(1 + 1)。请解释我很困惑。 [参考CLRS第260页]
在简单统一散列假设下,未成功搜索的最坏情况时间与平均情况时间相同。在简单统一散列的假设下,成功搜索的最坏情况时间将与平均情况时间不同。
答案 0 :(得分:3)
在Simple Uniform Hashing 的假设下(即假设的散列函数将项目均匀地分配到散列表的槽中),我相信查找操作的最坏情况性能将是与平均情况相同(对于不成功的查找) - Θ(n/m + 1)
(根据Wikipedia的平均情况)。
为什么?那么,请注意,在上述假设下,表中的每个插槽在其链中将具有相同数量的元素。因此,平均情况和最坏情况都将涉及查看任何链中的所有元素。
当然,这是一个相当乐观的假设 - 它实践我们很少/永远不会预先确定散列函数,它将均匀地分布一些未知数据集(我们很少专门为数据集构建散列函数),但是,同时,我们不太可能遇到真正的最坏情况。
通常,使用链接的哈希表的查找或删除操作的最坏情况运行时间为Θ(n)
。
在这两种情况下,insert仍然可以实现为Θ(1)
,因为您只需插入链的前面即可。也就是说,如果我们允许重复(如提到Jim),因为如果没有,我们首先要检查它是否已经存在(即进行查找)。
最糟糕的情况发生在所有元素都散列到相同的值时,因此您将拥有一个非常长的链,实质上将您的数据结构转换为链接列表。
|--------|
|element1| -> element2 -> element3 -> element4 -> element5
|--------|
| null |
|--------|
| null |
|--------|
| null |
|--------|
| null |
|--------|