kmp算法

首先得理解前缀和后缀的概念:

部分匹配值就是前缀和后缀的最长的共有元素的长度.以ABCDABD为例

A的前缀和后缀都为空集,共有元素的长度为0,

AB的前缀为[A],后缀为[B],共有元素的长度为0

ABC的前缀为[A,AB]后缀为[B,BC]共有的元素的长度为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

在KMP算法中有个数组,叫做前缀数组,也有的叫next数组,每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符,当然它描述的也是子串的对称程度,程度越高,值越大,当然之前可能出现再匹配的机会就更大。

 现有以字符串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
















你可能感兴趣的:(kmp算法)