1. 寫在前面的事情的起因是這樣的,我要處理一段這樣的程式,使用者可以以任意的形式輸入11位數字+空格的形式,然後我要把他分成434的格式。接下來是測試結果:然後想到的辦法是:
去掉所有空格,然後按照規則劃分成陣列,然後再輸出。
那麼怎麼樣去掉空格,常規的方法這麼幾個:
a. string.replace()
b. string.split(new char,stringsplitoptions.removeemptyentries);
c. system.text.regex()來進行正則替換
d. 有人提出用stringbuilder,但是我們永遠不要忘記stringbuilder的臨界值,在小資料的情況下,使用stringbuilder反而是得不償失的。
2. 效能大比拼
毋容置疑,使用正則一定是最慢的辦法,再次不做演示。
首先貼出測試**:
static void main(string args)sw.start();
for (int i = 0; i < 1000; i++)
sw.stop();
console.writeline(sw.elapsedmilliseconds.tostring());
sw.reset();
sw.start();
for (int i = 0; i < 1000; i++)
, stringsplitoptions.removeemptyentries);
}sw.stop();
console.writeline(sw.elapsedmilliseconds.tostring());
}
正如我們意料中的一樣,replace的效率一定要比split高的,猜測的理由其實很簡單,replace的作用就是用來替換字元,而split是用來拆分,這裡屬於典型的方法亂用。
擴充套件閱讀: 《.net,你忘記了麼?(八)—— 從dynamic到特性誤用》
3. 談談string.split()
我沒有辦法看到string.replace()原始碼,那麼在這裡就只說說string.split()。
大致**可以通過reflector看到,這裡只貼上出核心的**:
public string split(string separator, int count, stringsplitoptions options)首先我們來關注下makeseparatorlist方法,在這個方法裡,微軟通過遍歷分隔符陣列和字串,兩層for迴圈,得到了字串中,每個分隔符所在的索引。接下來就是根據索引來直接分割字串了,無需贅言。; }
if (flag)
return this.internalsplitkeepemptyentries(seplist, lengthlist, numreplaces, count);
}
4. 演算法分析
從上面的**,我們可以很輕鬆地看出,演算法的時間複雜度是o(m*n),那麼我們有沒有更優的演算法來實現他呢?
首先,我們要看到演算法的時間複雜度瓶頸在於makeseparatorlist方法,那就來優化這個方法,實現如下:
private static bool makeseparatorlist(char separatorarray)那麼之後我們就可以在遍歷字串的時候,直接通過每個字元的asc2碼來得到這個字元是否是分隔符了。return chararray;
}
5. 演算法優劣
既然這樣的演算法時間複雜度小,那為什麼微軟不採用這樣的演算法呢?
時間複雜度並不能決定演算法的優劣,我們所謂的指數型,對數型還是on級,都是針對當資料量大幅度增長時。但是在此問題中,分隔符只有1個,我們卻需要為這乙個字元去宣告乙個大小為255的bool型陣列,這在空間複雜度上是很得不償失的。
那麼該演算法適合什麼?該演算法適合當分隔符具有多個,字串也很長時,那麼o(n)就遠遠小於o(m*n)了。
6. 寫在最後
好久沒有寫東西了,以至於寫寫自己已經不知道自己在寫什麼了。
東西寫得亂七八糟,算了算了…….
只是警醒自己,也警醒各位,.net framework為我們提供了大量的類庫方法支援,但是在用乙個方法之前,我們是否該把這個方法搞清楚,這個方法是否是最優的方法,我們是該自己重新寫乙個方法,還是……
追本溯源,這才是程式設計師該做的。
C 去掉字串空格的方法
1 trim方法string tt aaa tt tt.trim 去字串首尾空格的函式 tt tt.trimend 去掉字串尾空格 tt tt.trimstart 去掉字串首空格 2 通過ascii碼值去掉字元中的空格 由於空格的ascii碼值是32,因此,在去掉字串中所有的空格時,只需迴圈訪問字串...
QString去掉字串中的空格
qstring中去掉多餘空格的方法有三種 1.remove方法來實現 qstring str aa ss ff jj str.remove qregexp s 這種方式會去掉字串中的所有空格。結果 aassffjj 2.simplified qstring str aa t ss n ff r n ...
iOS 字串NSString中去掉空格
問題描述 某些情況下,伺服器返回的字段中含有空格,這空格是伺服器開發人員不小心往資料中多敲了,但客戶端需要保護,所以在客戶端需要把字串中的空格過濾掉。問題分析 1 使用nsstring中的stringbytrimmingcharactersinset nscharacterset whitespac...