簡體   English   中英

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(n 2 ) 復雜度。

C 字符串不明確存儲長度,它們在末尾只有一個空值。 因此,要計算出您需要逐個字符地遍歷整個字符串的長度。 另一方面,'sid::string::length' 只返回內部存儲的長度。

不過,您可以通過在循環之前將長度緩存在變量中並在 for 語句中使用緩存的長度來輕松加速 C 版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM