vector.push_back() 非常慢

vector.push_back() being very slow

提问人:Lithanium 提问时间:10/30/2023 最后编辑:Uwe KeimLithanium 更新时间:10/30/2023 访问量:134

问:

我参与的项目的时间复杂度为 O(N^3),其中 N 约为 300。我使用的是元组向量,运行所需的时间非常慢,远远超过 5 秒。

我进一步调查并对我的原始程序进行了基本时间测试。

#include <bits/stdc++.h>
using namespace std;

vector<tuple<int, int, int>> pos[305];

int main() {
    auto start = clock();
    for (int i = 1; i <= 300; i ++) {
        for (int j = 1; j <= 300*300; j ++) {
            pos[i].push_back({0, 0, 0});
        }
    }
    cout << (double)(clock() - start)/CLOCKS_PER_SEC;
}

上面的这段代码是我使用的代码。平均而言,它运行需要 3.5 秒才能运行。根据先前的知识,vector.push_back() 是摊销的 o(1),因此它大约运行 300^3 = 27000000。即使元组向量的常数因子为 3,该程序也应该在一秒钟内运行良好。

为什么这段代码需要这么长时间才能执行,这与vector.push_back()的速度有关吗?

C++ 向量 时间复杂度

评论

3赞 273K 10/30/2023
如何编译代码?如果启用优化,则需要 0 秒。
2赞 Tim Roberts 10/30/2023
您在这里进行了 2700 万次内存重新分配。在你开始内循环之前做,它就会拉上拉链。 未摊销 O(1)。它是 O(logN),因为它必须重新分配和复制内存。pos[i].reserve(300*300)vector.push_back
6赞 273K 10/30/2023
任何没有编译器优化的基准测试都毫无意义。
2赞 harold 10/30/2023
当编译得更合理时,此代码(即使没有建议的更改)在我的 PC 上运行不到一秒钟(只是,没有什么像目标说明符那样花哨的)-O2
2赞 Abstraction 10/30/2023
@TimRoberts - 不,不应该有 2700 万次重新分配(除非编译器的库写得很草率,这可能是可能的)。 通常根据当前大小按比例分配新空间,而不是一次分配一个元素。我认为了解编译器可能会对这个主题有所了解。std::vector

答: 暂无答案