将字符串插入到c++stl集的时间复杂度
Time Complexity of inserting string to c++ stl set
将字符串插入到c++STL的容器集的时间复杂度是多少?根据我的说法,它应该是O(xlogn),其中x是要插入的字符串的长度,n是集合的大小。同时,将字符串复制到集合的长度应该是线性的。但我的这个代码正在立即运行。
#include<bits/stdc++.h>
using namespace std;
int main(){
set<string> c;
string s(100000,'a');
for(int i=0;i<100000;i++){
c.insert(s);
}
}
我错在哪里了,复杂性不应该是10^10的数量级吗?
您应该以某种方式使用set
来降低循环被优化的风险,例如添加return c.size();
。
此外,您对迭代次数的选择可能过低。在循环计数器上加一个数字,你会看到一个明显的运行时间。
现代CPU可以轻松处理>2*109操作/s。假设您的编译器使用memcmp
,它可能是手动矢量化的,并且有一个像您这样的小工作集,那么您完全从缓存中工作,并且每次比较可以达到高达512字节的吞吐量(使用AVX2)。假设每次迭代10个周期的适度速率,我们仍然可以比较>1010字节/s。所以你的程序应该在<1在中等硬件上。
请尝试此更新代码:
#include <string>
#include <set>
using namespace std;
int main(){
set<string> c;
string s(100000,'a');
for(int i=0;i<1000000;i++) { // Add a digit here
c.insert(s);
}
return c.size(); // use something from the set
}
在启用优化(-O3
)的情况下,在我的系统上运行大约需要5秒。
换句话说,是的,插入二叉树具有O(logn)复杂性,但是比较字符串具有O(n)复杂性。这n不相同,在map
的情况下,它表示映射大小,在string
的情况下表示字符串的长度。
在您的特定情况下,贴图只有一个元素,因此插入是O(1)。纯粹从字符串比较中获得线性复杂度O(n),其中n是字符串长度*迭代次数。
相关文章:
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 函数的时间复杂度是多少?
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何计算此排序函数的时间复杂度?
- 计算两个代码块的时间复杂度
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- 具有嵌套 if-else 的循环的时间复杂度
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 如何计算函数的时间复杂度?
- 求解包含"variables"的 T(n) 时间复杂度
- 查找数字是否为 2 的幂的时间复杂度
- C++ - 最坏情况和平均情况插入时间复杂度在 std::unordered_map <int,int>?
- 为什么一种算法在相同的时间复杂度下比另一种算法更快?
- 关于记忆后这种递归关系的时间复杂度
- 2 个嵌套循环的时间复杂度
- 将字符串插入到c++stl集的时间复杂度
- C++:使用 STL 排序对不同列上的整数 2d 数组进行排序的时间复杂度