各种数据结构的时间复杂性是什么?

时间:2011-09-03 17:19:19

标签: java data-structures time-complexity

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

E.g。对于单链表:更改内部元素是O(1)。你怎么能这样做?您在更改之前搜索元素。另外,对于Vector,添加内部元素为O(n)。但是为什么我们不能在使用索引的摊销常数时间内做到这一点?如果我错过了什么,请纠正我。

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

1 个答案:

答案 0 :(得分:207)

阵列

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

的ArrayList:

  • 添加已摊还的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)

Heap / PriorityQueue(最小/最大):

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

的HashMap /哈希表/ HashSet的:

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