KMP算法 跳位理解

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。

 

「對應的部分匹配值」實質的意義在於:快速的把匹配串的前綴跟已匹配的後綴對齊,加速進入下一次匹配。

相關文章
相關標籤/搜索