正規表示式時間複雜度O(n)

菜雞03號發表於2016-09-07

1.有幾千個字串,要判斷每個字串中是否包含 “Book”,可以有兩種方法:

1>字串處理
   在迴圈內:
   if( str1.IndexOf("Book") > 0 )
   {
   }

2>正規表示式
   Regex r = new Regex( "Book" );   // 在迴圈外
   在迴圈內:
   if( r.IsMatch( str1 ) )
   {
   }

以上那種執行效率會高些?

更進一步,假如問題是:在幾千個字串中找出含有 “Book”和/或 “Expert”但不包含“Result”的字串,那種方法效率高些?用正規表示式該怎樣寫?




2.正規表示式時間複雜度

Regex的演算法複雜度是固定的O(n),在完成了Regex到有限自動機的轉換以後,判斷一個字串是否匹配所需的時間只和該字串的長度有關,這個字串裡面的每個字元至多會被檢查一次。

  String實現的IndexOf採用的是比較笨的辦法,某些情況下它可能需要檢查一個字元多次,比如匹配abac到ababac的時候。
  所以如果有大量的字串需要檢查,Regex應該要比IndexOf優化。如果有更多的匹配條件,那麼Regex的優勢就更明顯。你的例子“Book”和/或 “Expert”但不包含“Result”,IndexOf要檢查字串3次,但是Regex仍然只要一次(但是“不包含”的Regex寫起來不是很容易)。

相關文章