KMP(看毛片算法)Next数组的求法

博住看大话数据结构里的Next数组求法,看的云里雾里。看了大量帖子,然后根据网上帖子,以大话数据结构的思路,总结出Next数组的求法。

如有错误请指正。

先明确什么是部分匹配值?"部分匹配值"就是"前缀"和"后缀"的最长的共有元素的长度。

以"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。

知道了什么事部分匹配值后,再来看 大话数据结构伤的例子。

注意 这里的 j 从 1开始

j                   1   2   3   4  5   6

串                a   b   c   a   b   x

next[j]          0   1   1  1    2   3

当 j =1时,next[1]=0;  这是初始定义。

当 j=2时:实际上是判断第(2-1)个位置的串的部分匹配值。这里也就是第1个(a)串部分匹配值,大话数据结构里定义的无相同前后缀,则next[ j ]的值就为 1。明显一个元素哪来的前后缀嘛。所以就为1( 网上也有说next[ j ]的值就是第(j-1)串的部分匹配值 加 1 ,这样理解也正确)。

当 j=3时:实际上是判断第(3-1)个位置的串的部分匹配值。这里也就是第2个的串(ab)部分匹配值为0,也就是无相同前后缀, 所以值是1。

当j=4时:实际上是判断第(4-1)个位置的串的部分匹配值。这里也就是第3个的串(abc)部分匹配值为0,无相同前后缀,所以值是1。

当j=5时:实际上是判断第(5-1)个位置的串的部分匹配值。这里也就是第4个的串(abca)部分匹配值1,next[5]的值是2。这个2是怎么来的是需要注意的,大话数据结构的定义是,如果前后缀的一个字符相等,值就是2,两个字符相等,值就是3,所以n个相等的值,就是n+1,也就是部分匹配值加1。( 网上也有说next[ j ]的值就是第(j-1)串的部分匹配值 加 1 ,这样理解也正确)

当j=6时:实际上是判断第(6-1)个位置的串的部分匹配值。这里也就是第4个的串(abcab)部分匹配值2,next[6]是3。

总结完毕,收工。

 

你可能感兴趣的:(Java以及Javaweb相关)