模式匹配的一種改進算法,是由D.E,Knuth 與V.R.Pratt和J.H.Morris同時發現的,因此人們稱它爲克努特-莫里斯-普拉特操作(簡稱KMP算法)。此算法可以在O(n+m)的時間的數量級上完成串的模式匹配操作。改進在於:每當一趟模式匹配過程中出現的字符比較不等時,不需要回溯i指針,而是利用已經得到的“部分匹配”的結果將模式向向右“滑動”儘可能遠的一段距離後,繼續進行比較。(摘自嚴蔚敏版《數據結構》)(看完整篇你會懂01112231123456712)
next[j]函數,表明當前模式中第j個字符與主串中響應字符“失配”時,在模式中需重新和主串中歐冠該字符進行比較的字符位置。
舉個栗子解釋一下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(嘟嘟囔囔:感覺應該也沒人能看到我這篇)