方法向量的新/分配的复杂性::p ush_back

Complexity for new/alloc for method vector::push_back

本文关键字:ush back 分配 向量 方法 复杂性      更新时间:2023-10-16
对于

下面的代码,对于 N 的巨大值,分配(realloc)/新操作的复杂性是多少?

据我所知push_back分配内存:
大小 = CST*old_size;
CST = 2;对于海湾合作委员会
所以我们在 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();  
}  

vector::p ush_back不完全是O(1),而是C++标准要求的摊销O(1)。查看固定摊销时间

当重新分配发生时,它将向量的分配大小加倍,因此(对于任意大的 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))。