KMP中next之我的个人理解

来源:互联网 发布:手机淘宝购物车 编辑:程序博客网 时间:2024/06/05 17:19

为什么len-next[len]就是最短循环节

例如有p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12的长度为12的串。

假设第13位的next对应的是8,从kmp角度来说意思就是:

p1 p2 p3 p4 p5 p6 p7 p8= p5 p6 p7 p8 p9 p10 p11 p12,这时我们可以找到这样一种关系,p1 p2 p3 p4= p5 p6 p7 p8=p9 p10 p11 p12,这样我们可以把这个长度为12的串每逢4个字符拆开,且才开后的每个子串都相等,且子串间是连续的,注意是“连续”的。所以可以拆成12/4个的串。答案为3。

假设第13位的next对应的是7,从kmp角度来说意思就是:

p1 p2 p3 p4 p5 p6 p7=p6 p7 p8 p9 p10 p11 p12,现在我们再通过这个等式,看看是否能找到一个子串像上例一样等分该串。很明显找不到。如果能找到了话,该字串的长度必然要等于5,因为等式的右边是从p6开始有循环的效果,所以p1 p2 p3 p4 p5必然要独立成串,才可以和后面的串进行匹配。你也可以这样想,如果p1 p2 p3 p4可以独立成串,那p5就没人跟他匹配,因为等式的右边是从p6开始的,要注意,你得出的子串是可以把母串连续分开的,如果只取p1 p2 p3 p4那么他只能等于p6 p7 p8 p9,很明显,这样做少了p5,没有把母串“连续”分开。但是如果p1 p2 p3 p4 p5作为字串,少可以保证分开后子串间是连续的,可是母串的长度为12,不可能逢5分开。答案只能是1。

假设第13位的next对应的是5,从kmp角度来说意思就是:

p1 p2 p3 p4 p5= p8 p9 p10 p11 p12,这下悲剧了,连p6 p7都没有,根本就谈不上找到一个连续的子串

假设第13位的next对应的是6,从kmp角度来说意思就是:

p1 p2 p3 p4 p5 p6= p7 p8 p9 p10 p11 p12。这个就又太好了,根本就不要去找,自己本来就连续了,意思就是 p7 p8 p9 p10 p11 p12可以用p1 p2 p3 p4 p5 p6来表示嘛~~~所以答案是2=12/6;

换一种说法说可以的:

假设第13位的next对应的是10,从next角度来说意思就是:

当第13位不匹配时,其实不可能匹配到第13位,我们先假设有这个位,那么j就要下移到p11,(注意我的next是从-1开始的,每个都少了1,书上都是从0开始的)也就是说我把这个串啊后移两位跟原来的串的对应的位置的字符都会相等,那我再移两位也肯定会相等,所以这个串可以每逢2为一子串。而且长度为12,正好可以逢2分开。

综上所述:一个串能否分为若干个相等连续的子串。把母串长n减去next[n+1],注意next要从-1开始算起,意思就是说我每逢长度为(n-next[n+1])分为一子串,头若干个的子串必然连续且相等,头几个还不行,所以要看看   n/(n-next[n+1]) 意思就是说我每逢(n-next[n+1])这么多个为一子串能否把母串给完整地分开,如果是整数可以分成n/(n-next[n+1])个。如果是小数,说明不能按这样分,那母串就不能分成若干相等连续的子串了……

0 0
原创粉丝点击