我们都知道std::vector::push_back
具有不变(摊销)的复杂性。
它是不变的,因为我们说摊销成本可以忽略不计,每次都会翻倍。重新分配是线性复杂性。
让我们稍微改变一下std::vector
界面,以不同的方式强制重新分配。
push_back
如果我们在每个push_back
重新分配,O(1)
仍然是push_back
(已摊销)吗?
每push_back
我们都会浏览向量中的所有项目
我想常量部分会在这里掉落,push_back
和重新分配都是O(N)
如果我们重新分配其他所有push_back
,O(1)
仍然push_back
(已摊销)吗?
与其他变体相比,push_back
仍然是线性的O(N)
?或者我们仍然可以假设它不断摊销?
答案 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。