KMP算法中next数组求法.docx
KMP算法中next数组求法 KMP算法是字符串匹配算法中的一种高效算法,next数组是KMP算法的核心结构。next数组的计算是KMP算法的关键步骤,本文将详细介绍next数组的计算方法。 next数组的定义: next数组的定义为:next[i] (i>0) 为:对于模式串S[], 我们用S[i, j]表示从S[]中i到j这一段子串。找一个k(0< k< i) 使得,S[0, k-1]与S[i-k, i-1]完全匹配,并且k的值最大,那么next[i]= k; 如果不存在完全匹配的,next[i]= 0; next数组的计算: next数组的计算可以通过递推的方法实现。假设next[i]= k, 则有S[0, k-1]== S[i-k, i-1]。那么如何求next[i+1]? 1. 如果S[k]== S[i+1], 则有S[0,k]== S[i-k, i], 可以肯定,不可能存在x> k, 使得S[0, x]== S[i-x, i] 故next[i+1]= next[i]+ 1= k+ 1; 2. 如果S[k]!= S[i+1], 可看成是一个模式匹配问题,相当于S[len(S)-K, len(S)]为主串,S[0, len(S)]为模式串的模式匹配,这时应将模式串向右滑动next[k]个字符,再比较S[next[k]]与S[i+1],如果相等,则next[i+1]= next[next[k]]+ 1, 如此继续。 代码实现: void get_next(){ next[0]= -1; int i= 0, j= -1; while( str[i] ){ if( j== -1 || str[i]== str[j] ){ i++; j++; next[i]= j; } else j= next[j]; } } next数组的计算是KMP算法的核心步骤,通过递推的方法可以高效地计算next数组,从而实现高效的字符串匹配。 KMP算法的应用场景非常广泛,在文本搜索、数据压缩、模式识别等领域都有着广泛的应用前景。