【问题标题】:What are the time complexities of various data structures?各种数据结构的时间复杂度是多少?
【发布时间】:2011-11-09 19:30:41
【问题描述】:

我试图列出常见数据结构(如数组、二叉搜索树、堆、链表等)的操作的时间复杂度,尤其是指 Java。它们很常见,但我想我们中的一些人对确切答案并不是 100% 有信心。非常感谢任何帮助,尤其是参考资料。

例如对于单链表:更改内部元素是 O(1)。你怎么能这样做?您必须在更改元素之前对其进行搜索。此外,对于向量,添加一个内部元素为 O(n)。但是为什么我们不能使用索引在摊销的常数时间内做到这一点呢?如果我遗漏了什么,请纠正我。

我将我的发现/猜测发布为第一个答案。

【问题讨论】:

标签: java data-structures time-complexity


【解决方案1】:

数组

  • 在特定索引处设置、检查元素:O(1)
  • 搜索O(n) 如果数组未排序,O(log n) 如果数组已排序并且使用类似于二进制搜索的方法,
  • 正如Aivean 所指出的,数组上没有可用的Delete 操作。我们可以通过将元素设置为某个特定值来象征性地删除它,例如-1、0 等,取决于我们的要求
  • 同样,数组的Insert 基本上就是开头提到的Set

数组列表:

  • 添加摊销 O(1)
  • 删除O(n)
  • 包含O(n)
  • 大小O(1)

链表:

  • 插入O(1),如果在头部完成,O(n) 如果在其他任何地方完成,因为我们必须通过遍历到达那个位置线性链表。
  • 删除O(1),如果在头部完成,O(n) 如果在其他任何地方完成,因为我们必须通过遍历到达那个位置线性链表。
  • 搜索O(n)

双向链表:

  • 插入O(1),如果在头部或尾部完成,O(n) 如果在其他任何地方完成,因为我们必须到达那个位置通过线性遍历链表。
  • 删除O(1),如果在头部或尾部完成,O(n) 如果在其他任何地方完成,因为我们必须到达那个位置通过线性遍历链表。
  • 搜索O(n)

堆栈:

  • O(1)
  • 流行O(1)
  • 顶部O(1)
  • 搜索(类似于查找,作为一种特殊操作):O(n)(我猜是这样)

队列/双端队列/循环队列:

  • 插入O(1)
  • 删除O(1)
  • 大小O(1)

二叉搜索树:

  • 插入、删除和搜索:平均情况:O(log n),最坏情况:O(n)

红黑树:

  • 插入、删除和搜索:平均情况:O(log n),最坏情况:O(log n)

堆/优先队列(最小/最大):

  • 求最小值/求最大值O(1)
  • 插入O(log n)
  • 删除最小值/删除最大值O(log n)
  • 提取最小值/提取最大值O(log n)
  • 查找、删除(如果提供的话):O(n),我们将不得不扫描所有元素,因为它们不像 BST 那样排序

HashMap/Hashtable/HashSet:

  • 插入/删除O(1)摊销
  • 重新调整大小/散列O(n)
  • 包含O(1)

【讨论】:

  • 将一个元素插入到数组中(我的意思是 insert 将新元素添加到位置,将所有元素向右移动)将花费 O(n)。删除也一样。仅替换现有元素将花费 O(n)。也有可能您将它与向可调整大小的数组添加新元素混合在一起(它已摊销 O(1) 时间)。
  • 另外请注意,双向链表在头部和尾部插入和删除都需要 O(1)(你只提到了头部)。
  • 最后要注意的是,平衡搜索树(例如,Java 中实际用于 TreeMap 的红黑树)保证所有操作的最坏情况时间为 O(ln n)。跨度>
  • @Aivean:我只是想列出标准数据结构的标准操作。对于数组:在添加/删除时移动元素不是标准操作。此外,替换现有元素需要 O(1) 使用索引,而不是 O(n)。对于双向链表:你是对的,我正在纠正。对于红黑树:再一次,你是对的。但我只列出了一个 BST,不需要平衡。因此,我将为红黑树添加新条目。感谢 cmets!
  • @SuhailGupta:Set 的复杂性已经作为最后一点给出。
【解决方案2】:

Baeldung 在此处指出了 ArrayList、LinkedList 和 CopyOnWriteArrayList 的一些时间复杂性:https://www.baeldung.com/java-collections-complexity 以及此处的 Map 实现:https://www.baeldung.com/java-hashmap

他还添加了基准以突出实现之间的差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多