2010-11-08 110 views
2

我正在編寫一個搜索應用程序,用於標記大型文本語料庫。String.Split效率問題

文本解析器需要從文本中刪除任何胡言亂語(即[^ A-ZA-Z0-9])

我有2個想法在我的腦海如何做到這一點:

1)將文本放在一個字符串中,使用String.tocharArray將其轉換爲charArray,然後通過循環運行char字符 - > while(位置< string.length) 這樣做可以在整個字符串數組中標記整個字符串數組文本。

2)使用string.replace去除所有非數字/ alpha,然後用一些分隔符對string.split進行去除,這意味着我必須對整個字符串運行兩次。 一次刪除不好的字符,然後再分裂它。我認爲,既然#1和#2一樣,但是在O(n)中會更快,但是在測試兩者之後,#2更快(方式!)。

我走得更遠了,並使用red-gate .net反射器查看了String.Strip背後的代碼。 它像#1一樣通過char運行非託管字符,但仍然快得多。

我不知道爲什麼#2比#1快。

任何想法?

+0

正如所描述的,我認爲方法1和方法2都是O(n) – Greg 2010-11-08 22:26:07

+2

這是毫無意義的猜測,直到你張貼代碼,每個人都可以嘗試。對於我們所知道的,你真的在​​#1上瘋狂。 String.Replace()進行了大量優化,因爲它是O(nm)算法,但仍需要運行它k次。你的發現沒有多大意義。 – 2010-11-08 22:35:57

回答

1

這個怎麼樣的想法:

  1. 創建一個字符串
  2. 加載整個數據集到字符串
  3. 創建具有足夠的預分配的空間一個StringBuilder容納整個字符串
  4. 圍棋字符逐字符串,如果字符是字母數字,則將其添加到StringBuilder。
  5. 最後,從StringBuilder中獲取字符串。

我不知道這是否會更快,你已經嘗試過,但計時上述應該至少回答這個問題。

+0

經過額外的調試後,我發現在處理數字時我的效率非常低。 – djTeller 2010-11-10 09:43:31

0

djTeller,
#2更快的事實只是相對於你的#1方法。
您可能想與我們分享您的#1方法;也許它只是非常緩慢,甚至可能比#2更快。
是的兩個都基本上是O(n),但是實際的實現O(n);你怎麼做#1?另外,當你說你測試了兩者,我希望你做了大量的輸入來克服誤差幅度,並看到兩者之間的顯着差異。

+0

我測試了一個巨大的1 GB語料庫。我將很快粘貼代碼。 – djTeller 2010-11-09 08:58:54