各种数据结构的时间复杂度是多少?


86

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

例如,对于单链表:更改内部元素为O(1)。你怎么能这样做?你HAVE更改它之前要搜索的元素。同样,对于向量,添加内部元素的方式为O(n)。但是为什么我们不能使用索引在固定的摊销时间内完成呢?如果我缺少某些东西,请纠正我。

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


2
所有数据结构的时间和空间复杂性大O备忘单
Vbp 2014年

1
万一别人踏入这个,花一分钟也检查此链接:infotechgems.blogspot.gr/2011/11/...
vefthym

Answers:


244

数组

  • 设置,检查元素是否位于特定索引处:O(1)
  • 搜索O(N) ,如果阵列是无序和O(log n)的,如果数组进行排序和类似二进制搜索时,
  • 正如Aivean指出的那样Delete在Arrays上没有可用的操作。我们可以根据需要将一个元素设置为某个特定值(例如-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)

3
将一个元素插入Array(通过插入,我的意思是将新元素添加到位置,将所有元素向右移动)将花费O(n)。删除相同。仅替换现有元素将采用O(n)。另外,也可能将它与在可调整大小的数组中添加新元素混合在一起(已摊销O(1)时间)。
Aivean 2014年

还请注意,对于双链表,在头和尾同时插入和删除都将采用O(1)(您仅提及头)。
Aivean 2014年

最后要注意的是,平衡的搜索树(例如,Java中实际用于TreeMap的红黑树)已保证所有操作的最坏情况时间为O(ln n)。
Aivean 2014年

@Aivean:我只是想列出标准数据结构的标准操作。对于数组:在添加/删除时移动元素不是标准操作。同样,替换现有元素需要使用索引O(1),而不是O(n)。对于双链表:您是正确的,我正在纠正。对于红黑树:同样,您是对的。但是我只列出了一个BST,不需要进行平衡。因此,我将为“红黑树”添加新条目。感谢您的评论!
Bhushan 2014年

1
@SuhailGupta:Set的复杂性已经作为最后一点给出。
hu山
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.