KMP 演算法詳解(c語言描述)

2022-05-05 21:57:07 字數 1344 閱讀 8274

**自大牛matrix67的部落格

a56b

b47a

a57a

a37a

a17a

0終於,a[8]=b[1],i變為8,j為1。事實上,有可能j到了0仍然不能滿足a[i+1]=b[j+1](比如a[8]="d"時)。因此,準確的說法是,當j=0了時,我們增加i值但忽略j直到出現a[i]=b[1]為止。

這個過程的**很短(真的很短),我們在這裡給出:

j =-

1;for(

inti =0

; i

<

n; i++)

}

j:=0

;fori:=

1ton do

begin

while

(j>0)

and(b[j+1

]<>

a[i])

doj:

=p[j];

ifb[j+1

]=a[i]

thenj:=

j+1;

ifj=m

then

begin

writeln(

'pattern occurs with shift ',i

-m);j:=

p[j];

end;

end;

p[5]=3是因為b[1..3]和b[3..5]都是"aba";而p[3]=1則告訴我們,b[1]、b[3]和b[5]都是"a"。既然p[6]不能由p[5]得到,或許可以由p[3]得到(如果b[2]恰好和b[6]相等的話,p[6]就等於p[3]+1了)。顯然,p[6]也不能通過p[3]得到,因為b[2]<>b[6]。事實上,這樣一直推到p[1]也不行,最後,我們得到,p[6]=0。

怎麼這個預處理過程跟前面的kmp主程式這麼像呢?其實,kmp的預處理本身就是乙個b串「自我匹配」的過程。它的**和上面的**神似:

p[0] 

=-1;

inti, j =-

1;for(i =1

; i

<

m; i++)

p[1]:

=0;j:

=0;fori:=

2tom do

begin

while

(j>0)

and(b[j+1

]<>

b[i])

doj:

=p[j];

ifb[j+1

]=b[i]

thenj:=

j+1;

p[i]:=j;

end;

KMP演算法描述

kmp演算法是一種優秀的字串匹配演算法,字串匹配的常規演算法是一步一步進行移位和比較操作,直至找到完全相匹配的字串。下面通過乙個例子,為大家仔細說明kmp演算法的使用和思路 問題 在字串 deabcdababcdabcdabde 字串中,匹配字串 abcdabd 演算法思路 kmp演算法的思路在於,...

KMP演算法詳解(C語言實現)

kmp的演算法分析 kmp解決問題 清除bf演算法中主串s指標出現的回溯情況,即當主串s和子串t在某個字元不匹配的時侯,主串s的指標位置不變,改變子串t的指標位置,使主串和子串的字元匹配 演算法思路 建立乙個next陣列,當出現主串字元與子串字元不匹配時,將模式串t的指標 j 移動到next j 的...

c語言kmp演算法

kmp是一種可以在字串中迅速找到某乙個指定的連續字串的演算法。要理解這個演算法首先要了解如何得到字串的next值。傳統的匹配方法中,每與字串進行一次未完全匹配的比較,都要從頭開始再進行一次,於是kmp就有next陣列來避免這種重複的比較,進而降低時間複雜度。next陣列的含義 與字串相對應的下標表示...