字符串匹配:kmp,bm和sunday算法

1.KMP算法

先了解一下KMP的核心,跳轉表:
跳轉表是對於模式字符串而言,即你需要在目標字符串匹配到的內容。

例如你想在ababdbccbababcd中匹配到baba,那麼baba就是模式字符串。
下面介紹跳轉表的實現方法:
跳轉表的匹配是匹配前後綴,匹配目標是永遠從第一個字符開始的字符串的字串,例如baba這個字符串:

匹配目標 前綴 後綴 跳轉值
ba b a 0
bab b,ba b,ab 1

可以看出前綴和後綴永遠是從左到右有序的。

跳轉表的使用:
在匹配時:
ababdbccbababcd
baba
無匹配,往後移動一位
ababdbccbababcd
 baba
匹配到三個,第四個a無匹配,然後去找含有三個元素子串的對應值,其對應值爲1,即向後移(長度-對應值個)單位,即移兩個單位,這個原理是我們運用已匹配的數據,比如例子中的bab,因爲我們已經知道了這三個已經匹配到絕對不會全是我們需要的,然後我們通過前面的匹配知道了b是重複元素,那麼我們可以利用後面這個已經匹配的b來加速我們的判斷過程。

2.BM算法

BM算法不僅比KMP簡單,而且具有更高的效率。
BM算法的核心在於從後向前匹配以及不包含項目的快速跳轉。
還是以KMP中的例子爲例介紹BM算法,我們想在ababdbccbababcd中匹配到baba。
先將兩個字符串對其,得:
ababdbccbababcd
baba
從後往前匹配時,我們發現最後一個就已經不匹配了,我們將其往後移一位,得:
ababdbccbababcd
 baba
發現最後一個仍然不匹配,並且d不在我們的模式串裏,那麼我們可以直接後移一個模式串的距離。

3.Sunday算法

有了前兩個的基礎,sunday算法也很好理解

還是以KMP中的例子爲例,我們想在ababdbccbababcd中匹配到baba。
先將兩個字符串對齊,得:
ababdbccbababcd
baba
從前向後匹配,我們發現並不匹配,然後找不匹配部分的下一個字符,即d字符,然後發現d不在模式串中,那我們直接往後移動一個模式串+1的距離,即:
ababdbccbababcd
          baba
然後從前向後匹配,發現第二個不匹配,這時候找到不匹配部分的下一個字符,即a,然後將模式串裏的a和其對齊,注意模式串是從後向前掃描的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章