Kmp算法图解——next数组的生成代码

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算法理解的核心我认为就是对这部分的四段重合的理解)


4、然后再判断,如果P16=P4,则有next[17]=4+1=5,否则再继续递推,最不理想的结果就是一直如此递推,且都无法匹配,并且一直遇到了next[1]=0还没出结果,则递推结束


5、接下来再回头看一看next数组求解的代码,应该是豁然开朗了

posted @ 2021-08-07 16:15  Yu_tiann  阅读(1528)  评论(0编辑  收藏  举报