KMP算法之简单求next数组

前言
1.next数组的计算只与模式串有关,与主串无关
2.next可能有不同的表示方法,但意义不变
3.前缀:除最后一个字母外,前面字母的从前往后组合情况。串abaaba的前缀={a,ab,aba,abaa,abaab}
4.后缀:除第一个字母外,后面字母的从前往后组合情况。串abaaba的后缀={baaba,aaba,aba,ba,a}

next数组中存储的数是什么?

最大 **前缀==后缀 ** 是next数组中的元素值。

意义为:如果在与主串匹配的过程中子串失配,则不会回溯主串,只需子串倒退一定的位数,这个具体的位数就是next数组中存储的值有关。

#计算方法
串abaaba的前缀={a,ab,aba,abaa,abaab}
后缀={baaba,aaba,aba,ba,a}
前缀∩后缀={a,aba}
最大 前缀==后缀 为aba,数目为3.

1.next[1]=0

2.串ab的(最大 前缀==后缀 数)=0,next[2]=0
a b

3.串aba的(最大 前缀==后缀 数)=1,next[3]=1
a b a

4.串abaa的(最大 前缀==后缀 数)=1,next[4]=1
a b a a

5.串abaab的(最大 前缀==后缀 数)=2,next[5]=2
a b a **a b **

6.串abaabc的(最大 前缀==后缀 数)=0,next[6]=0
a b a a b c

7.串abaabca的(最大 前缀==后缀 数)=1,next[7]=1
a b a a b c a

8.串abaabcac的(最大 前缀==后缀 数)=0,next[8]=0
a b a a b c a c

规则1(最大前后缀):

《KMP算法之简单求next数组》
(上表也成位《最大长度表》)

按照网上的某些方法,next数组就求完了。WTF!明明不一样好吧!那好,next数组是为了后面用的,使用的方法不同,next数组也会稍有差别。

失配时,模式串向右移动的位数为:已匹配字符数 -失配字符的上一位字符所对应的最大长度值

引入规则:

规则2(下标从0开始计):

右移一位,最左边添-1,最右边自然溢出
next: -1 0 0 1 1 2 0 1

这是其中一种表示方法,见到-1用这种,失配时,模式串向右移动的位数为:失配字符所在位置 – 失配字符对应的next 值

也就是说,失配时,下一次开始匹配的元素就是next数组中存储的元素下标所指向的元素(下标从0开始)

将-1定义为相同长度为0,此时没有可以后退的了,子串向前移动一位。
0定义为:下一次从下标为0的开始匹配,即第一个元素。

规则3(下标从1开始计):

规则2基础上全部加1
next :0 1 1 2 2 3 1 2
也就是说,失配时,下一次开始匹配的元素就是next数组中存储的元素下标所指向的元素(下标从1开始)

将0定义为相同长度为0,此时没有可以后退的了,子串向前移动一位。
1定义为:下一次从下标为1的开始匹配,即第一个元素。

熟练掌握的话在考试中只需30秒可以手算出next数组。

参考链接:
http://www.cskaoyan.com/thread-650235-1-1.html
https://blog.csdn.net/v_july_v/article/details/7041827

    原文作者:KMP算法
    原文地址: https://blog.csdn.net/qq_33414271/article/details/82263006
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞