【问题标题】:What's the worst case running time of Hashing with Chaining?Hashing with Chaining 的最坏情况下的运行时间是多少?
【发布时间】:2013-12-13 14:23:45
【问题描述】:

假设哈希表槽的数量(比如 n)与表中元素的数量(比如 m)成正比。我们有 n = O(m), 负载系数 l = O(m)/m = O(1) 所以在Simple Uniform Hashing的假设下,搜索平均需要恒定的时间。这意味着平均搜索所花费的时间与链表的长度成正比,链表的长度对于所有时隙都是相同的,因此是恒定的时间。但是在 Simple Uniform Hashing 假设下的最坏情况运行时间呢?它也是恒定的还是O(1 + l)。请解释我很困惑。 [参考 CLRS 第 260 页]

在简单统一散列的假设下,不成功搜索的最坏情况时间是否与平均情况时间相同。在简单统一散列的假设下,成功搜索的最坏情况时间将不同于平均情况时间。

【问题讨论】:

标签: algorithm hash


【解决方案1】:

在简单统一哈希的假设下(即假设哈希函数会将项目均匀地分配到哈希表的槽中),我相信查找操作的最坏情况性能会与平均情况相同(查找不成功)-Θ(n/m + 1)(根据Wikipedia 的平均情况)。

为什么?好吧,考虑一下,在上述假设下,表中的每个槽在其链中都有相同数量的元素。正因为如此,一般情况和最坏情况都需要查看任何链中的所有元素。

当然,这是一个非常乐观的假设——它实践了我们很少/永远不会预先确定一个哈希函数来均匀分布一些未知的数据集(而且我们很少专门为数据集构建哈希函数),但是,在同时,我们不太可能遇到真正的最坏情况。

一般情况下,使用链接的哈希表查找或删除操作的最坏情况运行时间是Θ(n)

在这两种情况下,插入仍然可以实现为Θ(1),因为您可以只在链的前面插入。也就是说,如果我们允许重复(如Jim 提到的),因为如果不允许,我们首先必须检查它是否已经存在(即进行查找)。

最坏的情况发生在所有元素散列到相同值时,因此您将拥有一个非常长的链,本质上是将您的数据结构变成一个链表。

|--------|
|element1| -> element2 -> element3 -> element4 -> element5
|--------|
|  null  |
|--------|
|  null  |
|--------|
|  null  |
|--------|
|  null  |
|--------|

【讨论】:

  • Insert 可以实现为 O(1) 吗?仅当您允许重复时。
  • @JimMischel 哦,对。谢谢。我忘记了。添加了注释。
  • “在上述假设下,表中的每个槽在其链中都有相同数量的元素”——完全错误。这不是简单统一散列的意思。仅仅因为散列函数均匀地分布 整个 元素集,并不意味着它会对特定子集执行此操作。正如你所说,最糟糕的时间是 O(n)。
猜你喜欢
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
相关资源
最近更新 更多