std :: vector :: push_back的这些变体是常数还是线性的?

时间:2018-02-06 17:22:25

标签: c++ vector big-o push-back

我们都知道std::vector::push_back具有不变(摊销)的复杂性。 它是不变的,因为我们说摊销成本可以忽略不计,每次都会翻倍。重新分配是线性复杂性。

让我们稍微改变一下std::vector界面,以不同的方式强制重新分配。

push_back

重新分配一次

如果我们在每个push_back重新分配,O(1)仍然是push_back(已摊销)吗?

push_back我们都会浏览向量中的所有项目 我想常量部分会在这里掉落,push_back和重新分配都是O(N)

仅在奇数编号的push_back

上重新分配

如果我们重新分配其他所有push_backO(1)仍然push_back(已摊销)吗?

与其他变体相比,push_back仍然是线性的O(N)?或者我们仍然可以假设它不断摊销?

1 个答案:

答案 0 :(得分:1)

  

在这种情况下,push_back仍然会保持不变吗?

没有。它是O(realloc(n)),即O(n)

  

在这种情况下,push_back仍然是线性的O(N)

是。它的最佳性能为O(1),这是最差的情况O(realloc(n)),即O(n)。如果您拨打push_back N次,则会使用realloc拨打O(N) N / 2次,因此我们平均有O(N*(N/2)/N) = O(N/2) = O(N)

将其与大小push_back进行比较,在push_back上,我们只会调用realloc log(N)次。有关详细说明,请参阅this post