c++中字符串和字符数组声明的时间复杂度有什么不同?
What is the difference between time complexity of string and char array declarations in c++?
在问题链接中,我首先尝试使用字符数组。此解决方案超出了时间限制。
char s[100000];
cin >> s;
int cnt[26];
for(int i=0;i<26;++i)
cnt[i]=0;
for(int i=0;i<strlen(s);++i)
cnt[s[i]-'a']++;
int count =0;
for(int i=0;i<26;++i)
if(cnt[i]>0)
count++;
cout << count << endl;
但是之后我把上面的代码改成了:
string s;
cin >> s;
int cnt[26];
for(int i=0;i<26;++i)
cnt[i]=0;
for(int i=0;i<s.length();++i)
cnt[s.at(i)-'a']++;
int count =0;
for(int i=0;i<26;++i)
if(cnt[i]>0)
count++;
cout << count << endl;
代码很容易通过。而且第一个也超过了1秒的时限,而第二个超过了0.04秒的时限。为什么执行时间有这么大的差异?
std::string
单独存储其长度,因此s.size()
是一个即时操作。
for(int i=0;i<strlen(s);++i)
在每次迭代中调用strlen(s)
, strlen
循环遍历整个字符串直到字符串的末尾以找到字符串的长度。所以这个看起来无害的循环实际上是O(n2)复杂度。
C字符串不显式地存储长度,它们只是在末尾有一个null。所以要算出长度,你需要一个字符一个字符地遍历整个字符串。'sid::string::length'则返回内部存储的长度。
你可以很容易地加快C版本的速度,通过在循环之前缓存长度在一个变量中,并在for语句中使用缓存的长度。
相关文章:
- 向量 <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>?
- 为什么一种算法在相同的时间复杂度下比另一种算法更快?
- 什么是"渐近紧时间复杂度"?此代码的时间复杂度是否渐近紧张?
- 有没有什么方法可以降低时间复杂度来找到这个矩阵的幂n
- C++中strstr()函数的时间复杂度、空间复杂度和算法是什么
- c++中字符串和字符数组声明的时间复杂度有什么不同?