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數組求解的代碼,應該是豁然開朗了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM