这些时间复杂性是否正确

时间:2014-03-15 15:54:35

标签: c++ data-structures big-o time-complexity

我想知道关于以下几点的时间复杂性以及推理是否正确。

  1. 动态数组末尾的插入是O(1)和其他任何位置 O(n)(因为元素可能需要复制和移动)(类似于std :: vector)
  2. 通过单个链接列表搜索是O(n),因为它是线性的。
  3. 单个链接列表中的插入和删除可以是O(1)或 上)。如果节点的地址可用,则为O(1) 它是O(n),因为需要进行线性搜索。
  4. 我会很感激对此的反馈

3 个答案:

答案 0 :(得分:3)

  

动态数组末尾的插入是O(1)和O(n)中的任何其他位置(因为元素可能需要复制和移动)(类似于std :: vector)

动态数组的摊销时间复杂度为O(1)。 https://stackoverflow.com/a/249695/1866301

  

通过单个链接列表搜索是O(n),因为它是线性的。

  

单个链接列表中的插入和删除可以是O(1)或O(n)。如果是,那就是O(1)   该节点的地址可用,否则其O(n),因为需要进行线性搜索。

是的,如果链接列表的节点按其地址编制索引,则可以获得O(1),否则您将必须搜索列表中的O(n)。还有其他变体,如跳过列表,搜索是对数,O(log n)。 http://en.wikipedia.org/wiki/Skip_list

答案 1 :(得分:2)

1)动态数组末尾的插入是摊销 O(1)。原因是,如果插入强制重新分配,则需要将现有元素移动到新的存储块O(n)。如果确保每次分配时数组都以一个常数因子增长,那么最终这些移动很少变得无关紧要。插入到动态数组的中间将是O(n)以在插入点之后移位元素。

2)正确;搜索链接列表(已排序或未排序)是O(n),因为在搜索过程中将访问链接列表的每个元素。

3)这也是正确的。如果您不需要排序列表,插入单个链接列表通常实现为添加到列表的头部,因此您只需将列表头更新为新节点和新节点的下一个指针成为名单的老头。这意味着插入未排序的单链表通常会在没有太多讨论的情况下表示为O(1)。

答案 2 :(得分:1)

看看at this cheatsheet的算法复杂性,我将其用作参考