[英]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(n 2 ) 復雜度。
C 字符串不明確存儲長度,它們在末尾只有一個空值。 因此,要計算出您需要逐個字符地遍歷整個字符串的長度。 另一方面,'sid::string::length' 只返回內部存儲的長度。
不過,您可以通過在循環之前將長度緩存在變量中並在 for 語句中使用緩存的長度來輕松加速 C 版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.