new /分配方法vector :: push_back的复杂性

时间:2019-01-30 12:11:43

标签: c++

对于较大的N值,下面代码的alloc(realloc)/ new操作的复杂性是什么?

据我所知push_back分配内存:
大小= cst * old_size;
cst = 2; //用于gcc
因此,我们在第k个周期内有O(1),在第i个周期内有〜O(N)。 总之我有O(N),对吗?

std::vector<int> data;  
for (int i = 0; i < N; ++i)  
{  
    for (int k = 0; k < 2 * N; ++k)  
        data.push_back(k);  
    for (int k = 0; k < N; ++k)  
        data.pop_back();  
}  

2 个答案:

答案 0 :(得分:4)


vector :: push_back并不完全是O(1),而是C ++标准要求的摊销 O(1)。参见Constant Amortized Time

答案 1 :(得分:2)

发生重新分配时,它将使向量的分配大小加倍,因此(对于N的任意大值)在给定示例中将发生常数* log_2(N)次。

是的,push_back调用的复杂度被摊销为O(1),因为如果向量很大,重新分配不会花费更多的时间(更好:时间不取决于大小),但是重新分配仍将保持不变* log_2循环内(N)次(常数!= 0)。

最后,在k循环示例中,重新分配的复杂度为O(log2(N))和主循环的(已编辑),这是O(log2(N ^ 2))= O(2 * log2(N ))= O(log2(N))。