1、前言
首先,我们需要大致理解Kmp算法的整体思想以及大致原理,同时需要学会手算next数组的方法。这些都是很简单并且容易理解的,本文不再赘述,如对以上内容仍有疑问,推荐一个B站视频讲解:BV1jb411V78H
另外本文的所有图片出处:B站视频 BV16X4y137qw
2、代码
以下是本文讲要分析的Kmp算法中关于next数组的生成部分的代码(C语言实现):
void get_next(char ch[], int length, int next[]){ //length为串ch的长度
next[1] = 0;
int i = 1, j = 0; //i为当前主串正在匹配的字符位置,也是next数组的索引
while (i <= length){
if (j == 0 || ch[i] == ch[j])
next[++i] = ++j;
else //匹配失败的情况要进行回溯
j = next[j];
}
}
3、分析的准备——跟着代码走一遍逻辑
分析的例子:


4、分析的核心——背后的核心原理
1、next[j+1]
的最大值为next[j]+1
2、如果有
,那么next[j+1]
可能的次大值为next[next[j]]+1
,以此类推即可求出next[j+1]
(这是kmp算法的重点)
5、分析的深入——再以泛化的方式重新思考代码流程

6、图解分析
1、假设我们要求next[j+1]
,其中k+1=17

2、假设已知next[16]=8
,则元素的有以下的关系:P8 = P16
,则明显有next[17]=8+1=9

3、如果P8和P16不相等,又若next[8]=4
,则有如下关系(这也就是第5部分中的提到的四段重合,Kmp算法理解的核心我认为就是对这部分的四段重合的理解)
