【问题标题】:Why is a hash table considered O(1) time complexity and not O(n)?为什么哈希表被认为是 O(1) 时间复杂度而不是 O(n)?
【发布时间】:2021-01-16 19:19:55
【问题描述】:

底层哈希算法对密钥的每个字符进行哈希处理,我理解这是 O(n),其中 n 是密钥的长度。

当哈希表的底层方法之一为 O(n) 时,如何将其视为 O(1)?我认为最坏情况的复杂性优先。

【问题讨论】:

  • 取决于你做什么。插入n 元素,当然需要O(n) 操作。但是随后检索单个元素在O(1) 中,因为您只需要一个哈希操作。密钥的长度与复杂度类无关。
  • @derpirscher 我一定理解错了。插入一个元素时,hash 方法使用循环来更新键中每个字符的哈希值。循环运行的次数与键中的字符数一样多,因此哈希方法肯定会运行 O(n) 次,即使它是单个哈希操作。我在这里错过了什么?
  • 首先n是map中的元素个数,与key的大小无关。其次,O(n) 表示法是一种理论结构。这里重要的是比较或散列操作的数量。散列一个键被算作一次操作,不管键的大小。
  • @derpirscher 因此,无论该方法的时间复杂度如何,对另一种方法的调用总是被计为一个步骤?

标签: time-complexity big-o


【解决方案1】:

这完全取决于您的假设,以及您在分析中将什么视为可变参数。

通常,当您谈论哈希表操作的复杂性时,您会忽略哈希函数的细节,并且(可能不现实地)假设它是 O(1),即独立于键长度,或者您隐含地假设密钥长度受常数限制。这意味着唯一感兴趣的参数通常是哈希表中元素的数量。

但是,如果您想更深入地研究,您实际上是对的,您也可以将密钥的长度视为复杂性分析的可测量参数。但这真的取决于键的类型和散列函数的细节。正如您所说,哈希函数本身的复杂性很可能与密钥的长度成线性关系(但不一定)。然后,您可以将复杂性指定为两个变量中的函数,而不仅仅是一个。

【讨论】:

    猜你喜欢
    • 2020-09-11
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    相关资源
    最近更新 更多