【问题标题】:Is a lookup in a hash table O(1)?在哈希表中查找 O(1) 吗?
【发布时间】:2014-11-25 13:18:41
【问题描述】:

如果一个哈希表包含 N 个不同的项目,并且没有重载,那么 N 个项目的哈希必须有大约 lg(N) 位,否则太多的项目将获得相同的哈希值。

但通常说查找哈希表平均需要 O(1) 时间。

不可能在O(1)时间内生成lg(N)位,所以哈希表复杂度的标准结果是错误的。

我的推理有什么问题?

【问题讨论】:

  • O(1) 只是一个预期:D
  • cs.stackexchange.com/q/1643(链接了该网站上似乎相同的问题:cs.stackexchange.com/q/27748
  • @DavidRR 在这里丢失已接受的答案将是一种耻辱。另一个问题的公认答案在我看来并不合理——它断言不可能——一个人可以有一个固定大小的散列函数(读取固定数量的输入),但仍然保留 O(1) 查找随着表中的条目数增加到无穷大。 R.Martinho Fernandes 的答案在我看来是完全正确的,我发现它对我理解复杂性理论很有帮助。
  • @PaulHankin 对封闭问题的回答永远不会丢失。只是不能将新答案添加到已关闭的问题中。也就是说,也许更公平地说,您的问题和我引用的问题是相关而不是重复

标签: complexity-theory


【解决方案1】:

你的推理有问题是使用了相互矛盾的“时间”定义。

当有人说在哈希表中查找需要 O(1) 时间时,通常意味着它需要 O(1) comparisons,即找到一项所需的比较次数上面有一个常数。在这种“时间”的概念下,用于计算散列的实际时间(如您将测量的以秒为单位的时间)不会导致任何变化。

比较中的测量时间是一个近似值,虽然它可能无法以与以秒为单位的测量相同的方式反映现实,但仍可提供有关哈希表行为的有用信息。

对于大多数算法的渐近复杂性描述来说,这类事情都是正确的:人们经常使用具有非常抽象含义的“时间”,这不是“时间”的非正式含义,但更多时候是“操作数”(这种操作通常未说明,预计会很明显,或从上下文中清楚)。

【讨论】:

  • 优秀的答案。 O(1) 可以认为是“人口中的元素数量不影响算法运行时间”。
【解决方案2】:

分析是基于哈希函数是固定的,与表中存储的实际元素数量无关的假设。如果哈希表中有 N 个元素,则不是说哈希函数返回 lg N 位值,而是基于返回 k 位值的哈希函数进行分析,其中 k 独立于 Nk 的典型值(例如 32 或 64)提供的哈希表远大于实际所需的任何值。

所以从某种意义上说,是的,一个包含 N 个元素的表需要一个返回 O(lg n) 位的哈希函数;但在实践中,使用的常数远大于 lg n 的预期最大值。

【讨论】:

    【解决方案3】:

    哈希表搜索是 O(1)。 我认为您正在混合插入(即 O(n))和搜索。

    【讨论】:

    • 在hastable中搜索预期 O(1)。但最坏的情况仍然是 O(n)。
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 2020-11-10
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 2018-07-14
    • 2018-02-13
    • 1970-01-01
    相关资源
    最近更新 更多