【问题标题】:Time complexity for Hash table operations is O(1) or O(N)? [duplicate]哈希表操作的时间复杂度是 O(1) 还是 O(N)? [复制]
【发布时间】:2017-07-10 08:38:33
【问题描述】:

在回答数据结构算法问题时,如果我们使用 Hashtable(比如说 Java 集合框架中的那个)来解决问题,我们应该考虑 Hashtable 的底层复杂性还是我们可以安全地假设它为 O(1)?

我看到很多帖子将其视为 O(1),但我想知道为什么我们忽略底层操作,例如运行以获取给定键的值的哈希算法,由 Java 执行?

【问题讨论】:

  • 散列需要一个常数时间,常数时间的big-O是O(1)。它不依赖于哈希表中的项目数。

标签: algorithm data-structures hashtable


【解决方案1】:

要回答您的问题,您必须考虑哈希表的实际工作方式。哈希表本质上是将键映射到其值的数组。数组中每个键的位置取决于散列函数(散列函数将输入映射到单个输出值)。假设散列函数为 O(1)。

插入一个值:

如果我们想在哈希表中插入一些东西,我们使用键上的哈希函数 (f) 来定位存储它的位置,然后我们将值存储在该位置。每次我们向数组中插入一些东西都会花费 O(1) 时间,因为散列函数是 O(1)。在哈希表中搜索值也是如此。

搜索值:

如果我们想搜索一个值 x,我们必须求解 f(x),它会告诉我们 x 的位置哈希表内。这意味着搜索哈希表也将是 O(1)。

承认潜在的复杂性:

上面的答案是正确的,但前提是散列函数永远不会为任何给定的输入产生相同的输出(这可能很难完成)。这意味着散列函数有时会使用替代方法来避免此类冲突。这些替代方法通常需要 O(1) 才能到达第一个位置,但需要额外的操作(例如线性搜索)才能找到空位置。

基本上哈希表操作(插入和搜索)是 O(1),但是在表中存在冲突的情况下(多个键指向同一位置),这些操作可能需要更长的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2019-12-13
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    相关资源
    最近更新 更多