【发布时间】:2022-09-22 21:50:35
【问题描述】:
代码:
#include <iostream>
#include <vector>
template<typename T>
std::vector<T> flatten(std::vector<std::vector<T>> const &vec)
{
std::vector<T> flattened;
for (auto const &v: vec) {
flattened.insert(flattened.end(), v.begin(), v.end());
}
return flattened;
}
int main()
{
std::vector<std::vector<int>> vec {
{ 1, 2, 3 }, { 4, 5 }, { 6, 7, 8, 9 }
};
std::vector<int> flattened = flatten(vec);
for (int &i: flattened) {
std::cout << i << \' \';
}
return 0;
}
上面代码的时间复杂度是O(n)还是O(n^2)?我知道这只是一个 for() 循环,但是在 for 循环中使用 insert() 会使其变为 O(n^2)?
-
问问自己你的循环检查了多少次相同的元素。也问问自己在哪里插入发生,以及必须洗牌多少个值才能在该位置为其腾出空间。
-
还要考虑将值插入
flattened时可能需要的重新分配。 -
重新分配以增加
std::vector的摊销时间复杂度是恒定的。 -
第一个要回答的问题是:
n是什么?您发布的代码始终具有相同的输入,所有硬编码值,它不能增加,因此运行代码需要恒定的时间(以不依赖于输入大小的其他因素为模) -
仅考虑
flatten函数,n可以是元素的总数、外部向量的数量或内部向量的数量
标签: c++ time-complexity big-o code-complexity