當前位置:編程學習大全網 - 源碼下載 - 面試必備——BM字符串查找算法

面試必備——BM字符串查找算法

字符串的壹種基本操作是子字符串查找:給定壹端長度為N的文本字符串text和壹個長度為M(M<N)的模式字符串pattern,在文本字符串中查找和該模式字符串相同的子字符串。在這互聯網時代,字符串查找的需求在很多情景都需要,如在文本編輯器或瀏覽器查找某個單詞、在通信內容中截取感興趣的模式文本等等。

子字符串查找最簡單的實現肯定是暴力查找:

可以看到,暴力查找的最壞時間復雜度為O(N*M),實際應用中往往文本字符串很長(成萬上億個字符),而模式字符串很短,這樣暴力算法的時間復雜度是無法接受的。

為了改進查找時間,人們發明了很多字符串查找算法,而今天的主角 BM算法 (Bob Boyer和J Strother Moore發明,簡稱BM算法)就是其中的壹種。

不同於暴力查找算法的逐個字符對比,BM算法充分使用 預處理模式字符串 的信息來盡可能跳過更多的字符。在暴力算法中,比較壹個字符串都是從首字母開始,逐個比較下去。壹旦發現有不同的字符,就需要從頭開始進行下壹次比較,就需要將字串中的所有字符壹壹比較。BM算法的核心思路在於,文本字符串從左到右檢索,模式字符串從右到左檢索,當模式字符串的壹個字符pattern[j]和文本字符串的字符text[i+j]不匹配時,那麽在模式字符串中查找字符text[i+j]是否存在索引k,使得pattern[k] == text[i+j],k若存在, k應該為滿足條件的最右索引 。此時存在三種情景:

通過這種字符的移動方式來代替逐個比較,正是BM算法的高效的關鍵所在!那麽我們怎麽知道文本字符串的字符是否存在於模式字符串中?對的,預處理。我們在查找前,先建立壹張包含文本字符串的所有字符的字母表, 這張表中記錄著字母表中的每個字符在模式字符串中出現的最靠右的索引,如果在字符在模式字符串中不存在,那麽值為-1。

有了這張表,我們在查找時就可以高效的移動i。構建這張表很簡單:

構建好表,我們只需要按上面分析的情景,出現字符不匹配時,通過表,把i向右平移到具體位置即可。BM完整算法實現如下:

由於不匹配的情況屬於大多數,所以壹般情況下,BM算法的時間復雜度為O(N/M),是線性級別的!可以說是非常高效了。但它需要額外的空間字母表大小R,所以BM算法是以空間換時間的。

至此,BM字符串查找算法已經分析完了,其實算是壹種比較簡單的算法,學習起來很快就能搞懂~

面試必備——KMP字符串查找算法

  • 上一篇:潤滑油VG46和L-HM46有什麽區別?
  • 下一篇:佩戴貔貅有什麽講究與禁忌
  • copyright 2024編程學習大全網