kmp算法

首先得理解前綴和後綴的概念:算法

部分匹配值就是前綴和後綴的最長的共有元素的長度.以ABCDABD爲例數組

A的前綴和後綴都爲空集,共有元素的長度爲0,spa

AB的前綴爲[A],後綴爲[B],共有元素的長度爲0.net

ABC的前綴爲[A,AB]後綴爲[B,BC]共有的元素的長度爲0orm

ABCD的前綴爲[A,AB,ABC],後綴爲[BCD,CD,D],共有元素的長度爲0blog

ABCDA的前綴爲[A,AB,ABC,ABCD]後綴爲[BCDA,CDA,DA,A],共有元素中長度最長的爲A,長度爲1ci

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],共有元素的長度爲0get

在KMP算法中有個數組,叫作前綴數組,也有的叫next數組,每個子串有一個固定的next數組,它記錄着字符串匹配過程當中失配狀況下能夠向前多跳幾個字符,固然它描述的也是子串的對稱程度,程度越高,值越大,固然以前可能出現再匹配的機會就更大。it

 現有以字符串S對於next[]數組的定義以下:

 1) next[j] = -1  j = 0

 2) next[j] = max(k): 0<k<j   P[0...k-1]=P[j-k,j-1]

 3) next[j] = 0  其餘

則                 A        B        C         D         A          B        D

    j                0        1        2         3         4         5         6

next[j]          -1        0        0        0          0        1          2

好比說D以前的子串是ABCDAB

該子串的前綴是[A,AB,ABC,ABCD,ABCDA],後綴是[BCDAB,CDAB,DAB,AB,B] 

共有元素中長度最長的就是AB,長度爲2,那麼next[6] = 2;

也就是說在D不匹配的時候須要的移動位數知足

移動位數 = 已匹配的字符數 - 對應的部分匹配值

假設到D出現了不匹配的狀況,則已匹配的字符數爲6,next[6] = 2,所需移動位數爲6-2 = 4!

kmp算法中主要是對next數組的求值

相似abcabc這種的next值就比較高,而像abccba這種就比較低

這篇文章寫的至關到位,我都是看這以後才明白的:

http://blog.csdn.net/yearn520/article/details/6729426

相關文章
相關標籤/搜索