淺顯易懂KMP

模式匹配的一種改進算法,是由D.E,Knuth 與V.R.Pratt和J.H.Morris同時發現的,因此人們稱它爲克努特-莫里斯-普拉特操作(簡稱KMP算法)。此算法可以在O(n+m)的時間的數量級上完成串的模式匹配操作。改進在於:每當一趟模式匹配過程中出現的字符比較不等時,不需要回溯i指針,而是利用已經得到的“部分匹配”的結果將模式向向右“滑動”儘可能遠的一段距離後,繼續進行比較。(摘自嚴蔚敏版《數據結構》)(看完整篇你會懂01112231123456712)

next[j]函數,表明當前模式中第j個字符與主串中響應字符“失配”時,在模式中需重新和主串中歐冠該字符進行比較的字符位置。

next[j]=\left\{\begin{matrix} max\left \{ k|1<k<j,||"p_{1}....p_{k-1}"="p_{j-k+1}...p_{j-1}" \right \} & \\ 0&j=1& \\ 1 & other \end{matrix}\right. 

舉個栗子解釋一下KMP的過程:

分析:看前面公式當j=1時,next[j]=0;

j=2時,j前面只有一個字符,沒有前綴也沒有後綴這個就是那個其他情況,next[j]=1。(講道理,一般前面兩個,第一個都是 0,第二個都是 1)

j

1 2 3 4 5 6 7

模式串

a b c a a b b

next[j] 

0 1          

分析:j=3,我們分別來找前綴和後綴,之前的字符‘a’與‘b’不相等,及 既不是等於0的情況沒有找到相同的就是其他情況。

j

1 2 3 4 5 6 7

模式串

a b c a a b b

next[j] 

0 1 1        

分析:j=4,看這個字符的前面有沒有一樣的,沒有,還是1

j

1 2 3 4 5 6 7

模式串

a b c a a b b

next[j] 

0 1 1 1      

 


分析:j=5,看這個字符的前面有一樣的,這樣得到k-1=1;k=2;

j

1 2 3 4 5 6 7

模式串

a b c a a b b

next[j] 

0 1 1 1 2    

j=6

j

1 2 3 4 5 6 7

模式串

a b c a a b b

next[j] 

0 1 1 1 2 2  

j=7

j

1 2 3 4 5 6 7

模式串

a b c a a b b

next[j] 

0 1 1 1 2 2 3

圖擺在這感覺就差不多了,emmmm出道題  模式串爲:abcaabbcaabcaabdab    next[j]序列是多少?

答案見第一段那一串數

看完還不懂私信我能看到就給你一對一講(叉腰)還有nextval值回頭補QAQ(嘟嘟囔囔:感覺應該也沒人能看到我這篇)

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