【问题标题】:Asymptotic running time in hash table哈希表中的渐近运行时间
【发布时间】:2021-01-28 00:17:12
【问题描述】:

因为我们知道如果哈希函数均匀分布条目,那么哈希表的查询时间为 O(1)。

什么是渐近运行时间:

(a) 在单独的链式哈希表中添加 n 个具有连续键的条目(插入所有的时间,而不是每个都插入)

(b) 搜索不在表中的键。

我的理解是在哈希表中插入一个键是 O(1),所以插入这样的 n 个条目将是 O(n)。对于 b 部分,搜索表中不存在的键被认为是最坏的情况,因此搜索的渐近运行时间将为 O(n),因为它需要搜索表中的所有 n 个值。

【问题讨论】:

  • 认为它们是什么,为什么?
  • 据我了解,将键插入哈希表是 O(1),因此插入这样的 n 个条目将是 O(n)。对于 b 部分,搜索表中不存在的键被认为是最坏的情况,因此搜索的渐近运行时间将为 O(n),因为它需要搜索表中的所有 n 值。如果我错了,请纠正我。

标签: data-structures hashtable


【解决方案1】:

你是对的 a) - 它是 O(n),其中 n 是要插入的新密钥的数量,因为每个相对于预先存在的密钥数量都是 O(1)。

对于 b) - 你错了 - 它是 O(1)。搜索不在表中的键只需要穷举搜索该键散列到的桶,该桶的预期长度大致由负载因子给出:键与桶的比率。大多数哈希表旨在将负载因子保持在特定范围内,并在添加更多键时调整哈希表的大小。

例如,C++ 标准指定默认 max_load_factor 为 1.0,因此如果您将第 129 个元素插入到具有 128 个存储桶的表中,它将调整整个事物的大小以拥有 256 个存储桶(MS Visual C++ 使用电源-of-two 桶计数用于快速按位屏蔽哈希值到桶,GCC 使用素数来减少冲突)。无论如何,当负载因子保持在这样的范围内时——比如 ~0.5 到 1.0——你不太可能在存储桶中有超过几个元素,你会搜索实际上不在表中的键。

除了单独的链接之外,还有另一种将数据存储在哈希表中的方法,称为封闭哈希或开放寻址,其中 - 如果发生冲突 - 您可以使用其他存储桶。有很多方法可以选择这些桶:线性探测意味着您查看连续的桶,二次探测意味着您尝试例如+1、+4、+9、+16 来自哈希存储桶。使用这些方法,当负载因子接近 1.0,或者如果哈希函数质量很差,您更有可能接近 O(N) 的最坏情况性能,但如果您是不会阻止这种情况,并且具有较低的负载因子或更好的哈希函数 - 这将使性能保持在 O(1) 摊销水平。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多