程式員必知演算法—-BM字串尋找演算法

來源:互聯網
上載者:User

BM字串尋找演算法,由Boyer,Moore提出,因而得名。

該演算法和KMP演算法思想一樣,都是需要先進行預先處理,然後在每次進行匹配失敗時,根據預先處理的結果,快速找到下一次繼續匹配的位置。

與KMP不同的是,BM演算法在每次匹配時都從後往前開始匹配,這樣可以確保在模式字串的後面字元出現匹配失敗時能夠快速的進行下面的匹配。如果我們從前往後進行匹配檢查,那麼當出現前面字元匹配正確,而在最後一個字元出現匹配錯誤時,白白的浪費了前面的匹配檢查的時間。

也許你會說,從後面往前進行匹配檢查也會出現同樣的問題,我承認,的確存在這樣的問題,而且這也是最壞的情況,對於下面實現的演算法,該問題的時間複雜度會是O(M*N),但是完整實現的BM演算法能夠保證在最壞的情況下提供線性層級的已耗用時間。

我們在匹配檢測前,需要預先準備一個數組right[],該數組記錄著模式字串中各個字元在模式字串中最後出現的位置,即最靠右邊的位置。通過這個數組,在每次匹配檢測失敗後,能夠快速的找到下一輪進行匹配檢測的新位置。

在字串的尋找過程中,我們使用索引i在目標字串中從前往後移動,使用索引j在模式字串中從後往前移動,j的取值範圍為[M-1,0]。

在每一輪從後往前進行匹配的過程中,如果匹配成功,那麼就繼續往前進行匹配檢測;如果匹配失敗,那麼要根據不同情況,適當的調整下一輪匹配的位置。具體匹配失敗可分為兩下兩種情況:

(1)造成匹配失敗的字元沒有出現在模式字串中,此時需要將模式字串向右移動(實際編程實現中,是通過將i增加j+1來實現的),如果移動少於這個位移量,那麼都會使得模式字串中有字元和目標字串中該匹配失敗的字元對齊,從而再次匹配失敗。

(2)造成匹配失敗的字元出現在模式字串中,此時需要根據預先處理的right[]數組來確定需要移動的位移量,使用right數組可以使得目標字串中的該字元與模式字串中的最右邊相同字元對齊(這裡需要注意的是,此時有可能會出現模式字串左移的情況,這時,為了保證匹配的過程是一值往後移動的,需要至少使得i增加1,)。

演算法實現如下所示:

package com.algorithm.stringsearch;import java.util.Arrays;//字串尋找演算法,Boyer-Moore演算法public class BoyerMoore {private String pat;private int[] right;public BoyerMoore(String pat){this.pat=pat;int R=256;right=new int[R];Arrays.fill(right, -1);int patLen=pat.length();for(int i=0;i<patLen;i++){right[pat.charAt(i)]=i;}}public int search(String str){int i,j,N=str.length(),M=pat.length();int skip;for(i=0;i<=N-M;i+=skip){skip=0;for(j=M-1;j>=0;j--){if(str.charAt(i+j)!=pat.charAt(j)){skip=j-right[str.charAt(i+j)];if(skip<1){//保證模式字串時不斷向後移動的skip=1;}break;}}if(skip==0) return i;}return N;}public static void main(String[] args){String t1="bcbaabacaababacaa";String t2="ababac";BoyerMoore bm=new BoyerMoore(t2);System.out.println(bm.search(t1));}}

假設目標字串的長度為N,模式字串的長度為M,分析一下這個演算法的時間複雜度,在最壞的情況下,時間複雜度為O(M*N),但是在一般情況下,該演算法的時間複雜度為O(N/M)。

需要說明的是,完整的Boyer-Moore演算法通過複雜的預先處理,可以保證最壞情況下的時間複雜度也為線性層級的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.