模式匹配KMP和BM演算法

2022-06-21 05:54:15 字數 1507 閱讀 7728

字串模式匹配的兩大經典演算法。

概念:主串,又稱目標串

子串,又稱模式串

模式匹配就是在主串中匹配模式串。

模式串的next陣列求法:

next陣列下標從1開始

next[j] 值為模式串前j-1個字元最長相等前字尾長度+1

next[1]=0

串本身不能作為前字尾

模式匹配失敗時,next陣列規定了模式串向後滑動的位數

例題:p='aabaac'

next=

假設\(t[i]≠p[j]\)導致失配 。若\(p[j]==p[next[j]]\),此時模式串移動\(next[j]\)必然也會失配,改進用nextval陣列代替next陣列:

nextval[1]=0;

for(j>1;j<=n;j++)

if(p[j]==p[next[j]])

nextval[j]=nextval[next[j]];

if(p[j]≠p[next[j]])

nextval[j]=next[j];

設目標串t,模式串為p

對於模式串p,計算\(charjump[x]\)和\(matchjump[k]\),即壞字元和好字尾;

將t與p的第乙個字元對齊。t與p從右向左的逐字元比較,直至找到乙個不匹配字元或者p中所有字元都匹配成功;

若出現失配,即存在\(t[i]≠p[k]\),此時壞字元\(x=t[i]\),好字尾\(p'=p[(k+1) … (len(p)-1)]\)

按如下規則計算目標串t中查詢指標向右移動的距離\(dist[i]\):

若\((i+dist[i])≤len(t)-1\),則移動模式字串p,使之與\(t[i+dist[i]]\)右對齊,重複step2;否則,認為t中不存在與p匹配的子串,返回匹配失敗。

例題:若模式串為"abcadb",則

t中查詢指標的移動距離dist=模式串p的移動距離shift+好字尾的長度

matchjump陣列初始化

\(matchjump[k]=len(p)-k-1+len(p)\)

\(matchjump[len(p)-1] = 1\)

其中\(k∈[0,len(p)-2]\)

即模式串中字元到模式串尾距離+模式串長度

若存在好字尾,則依據「好字尾規則 」,重新調整\(matchjump[k](k∈[0,len(p)-2])\) (假定:好字尾p』為p[k+1]…p[len(p)-1] )

例1:

例2:

例3:

字串匹配演算法之KMP演算法和BM演算法

本文主要介紹kmp演算法和bm演算法,它們分別是字首匹配和字尾匹配的經典演算法。所謂字首匹配是指 模式串和母串的比較從左到右,模式串的移動也是從左到右 所謂字尾匹配是指 模式串和母串的的比較從右到左,模式串的移動從左到右。看得出來字首匹配和字尾匹配的區別就僅僅在於比較的順序不同。下文分別從最簡單的字...

python實現BM和KMP演算法

1.kmp演算法 def compute prefix function p m len p pi 0 m k 0for q in range 1,m while k 0 and p k p q k pi k 1 ifp k p q k k 1pi q k return pidef kmp matc...

模式匹配 KMP演算法

字串匹配演算法 include includeusing namespace std define ok 1 define error 0 define overflow 2 typedef int status define maxstrlen 255 使用者可在255以內定義最長串長 typed...