KMP算法最關鍵的點->跳位算法
怎麼跳?這裏要引入兩個知識。字符串
1:字符串先後綴:im
2:部分匹配表:img
"部分匹配值"就是"前綴"和"後綴"的最長的共有元素的長度。以"ABCDABD"爲例,移動
- "A"的前綴和後綴都爲空集,共有元素的長度爲0;字符
- "AB"的前綴爲[A],後綴爲[B],共有元素的長度爲0;
- "ABC"的前綴爲[A, AB],後綴爲[BC, C],共有元素的長度0;
- "ABCD"的前綴爲[A, AB, ABC],後綴爲[BCD, CD, D],共有元素的長度爲0;
- "ABCDA"的前綴爲[A, AB, ABC, ABCD],後綴爲[BCDA, CDA, DA, A],共有元素爲"A",長度爲1;
- "ABCDAB"的前綴爲[A, AB, ABC, ABCD, ABCDA],後綴爲[BCDAB, CDAB, DAB, AB, B],共有元素爲"AB",長度爲2;
- "ABCDABD"的前綴爲[A, AB, ABC, ABCD, ABCDA, ABCDAB],後綴爲[BCDABD, CDABD, DABD, ABD, BD, D],共有元素的長度爲0。
////////////////////////////////////////////////////////////////////////
逐字比較逐字移位:
在這一步的時候,若是仍是逐字移位,不划算了。由於前面已經匹配了6位「ABCDAB」。那麼應該移動6位?
No!KMP算法認爲 移動位數 = 已匹配的字符數 - 對應的部分匹配值
最後一個匹配字符B對應的"部分匹配值"爲2。
也就是 6-2=4 最後要跳過的位數爲4。
「對應的部分匹配值」實質的意義在於:快速的把匹配串的前綴跟已匹配的後綴對齊,加速進入下一次匹配。