從字串中查詢字元出現次數的方法和效能對比

2021-09-20 15:04:36 字數 1102 閱讀 9078

今天在一場「特殊的討論」中引入了乙個問題,如何在c#求出字串中某字元的出現次數,比如求「adsfgehergasdf」中「a」出現的次數。首先想到的方法當然是從頭遍歷字串並統計:

c1 = 0;

for (int i = 0; i < str.length; i++)

}第二種方法也很容易想到,將字串中所有要查詢的字元去除,然後比較去除前後的字串長度即可。這種方法遭到了某人的鄙視,據說效能很差而且多佔空間。

c2 = str.length - str.replace("a",string.empty).length;

接下來某人又提出了第三種方法,是用要查詢的字元為分隔符,將原字串分隔為多個子串,然後求子串的數目即可。在c#中這是乙個寫起來很短的方法:

c3 = str.split(new char ).length - 1;

我們從原理可以推斷出三者效能的順序,但究竟差距是多少呢,還是要動手試驗一下。這是非常經典的測試**:

首先我們確保正確性,經測試三種方法都能正確處理多種情況,包括首尾、連續出現、不出現或串長度為0等,我所取的字串是乙個很普通的串。編譯為release版,預執行10次後獲得以下結果:

遍歷統計:13毫秒

替換後比較長度:112毫秒

斷開字串後計數:233毫秒

這裡已經體現出差異,遍歷統計比替換後比較要快10倍,斷開字串又要慢一些。接下來我又做了如下兩個測試:

1、不改變字串的長度,增加或減少要查詢字串的個數。

2、不改變要查詢字元出現的頻率,但增長字串的長度。

結果發現,三種方法都隨字串長度增加線性變慢,而後兩種方法還隨要查詢的字元增加而變慢。斷開字串的方法還受要查詢字串分布情況的影響。

研究replace函式和split函式的實現可以徹底解決這個問題。不過我沒有心情細細研究了,我還是決定選用第二種方法----替換後比較長度。雖然其速度比第一種方法慢,但易於改寫為求長度不為1的子串出現次數的方法。第一種方法若改為求長度大於1的字串就要考慮很多因素(儘管不一定真的很麻煩)!

從字串中查詢字元出現次數的方法和效能對比

今天在一場 特殊的討論 中引入了乙個問題,如何在c 求出字串中某字元的出現次數,比如求 adsfgehergasdf 中 a 出現的次數。首先想到的方法當然是從頭遍歷字串並統計 c1 0 for int i 0 i str.length i 第二種方法也很容易想到,將字串中所有要查詢的字元去除,然後...

從字串中查詢字元出現次數的方法和效能對比

今天在一場 特殊的討論 中引入了乙個問題,如何在c 求出字串中某字元的出現次數,比如求 adsfgehergasdf 中 a 出現的次數。首先想到的方法當然是從頭遍歷字串並統計 c1 0 for int i 0 i str.length i 第二種方法也很容易想到,將字串中所有要查詢的字元去除,然後...

php查詢字串出現次數的方法

在php中查詢字串出現次數的查詢可以通過substr count 函式來實現,下面就來給大家詳細介紹這些函式.substr count haystack,needle offset length 其中引數 haystack表示母字串,needl表示要查詢的字元 offset表示查詢的起點,lengt...