首页 > 代码库 > KMP改进(nextval)
KMP改进(nextval)
为什么要对next进行改进呢?因为next存在缺陷。。。O(∩_∩)O哈哈~。。。
什么缺陷呢?
课上老师PPT中的那个例子不太好,并没有把核心体现出来,只是一部分,所以请结合课件和下面的例子仔细体会。
设 S串 abcabdabcabcd ; P串 abcabcd
好了,先求出P串的next[],(听话,求出next[],别看了,让你在自己电脑上把next求出来,不会的话,代码在上一篇博客(http://www.cnblogs.com/xiaoshanshan/p/4081693.html ));
好了,估计你也没听话,算了,往下看吧。
next[0..6] = {-1,0,0,0,1,2,3};
接下来重点来了,让我们看一下,KMP是怎么做的,(KMP叫你呢,快出来) (渣) 。。。 O(∩_∩)O哈哈~。。。
这个过程有点长啊,请大家耐心往下看,(我打出来时间更长。。。。)
S a(bcabdabcabcd) ab(cabdabcabcd) abc(abdabcabcd) abca(bdabcabcd) abcab(dabcabcd) abcabd(abcabcd)
P a(bcabcd) ab(cabcd) abc(abcd) abca(bcd) abcab(cd) abcabc(d)
(我擦。。。看我next。。。next[5] == 2)
S abcabd(abcabcd)
P abc(abcd)
(KMP 你可以停了。) (渣)。。。。O(∩_∩)O哈哈~。。。
大家看到了吧。 看什么? 看上面讲的啊,不明白什么意思?那就往下看:
刚才 P[next[5]] == P[5] == ‘c‘ 对吧。好了,现在懂了吧,这次的匹配白匹配了,因为肯定是不匹配的。现在懂了吧。
纳尼?你还不懂,P[5] == P[2]对吧,P[5]都不行了,P[2]肯定不行啊。(next,去叫nextval来)
那么,让我在讲nextval之前,大家先看看nextval是怎么工作的吧。
S a(bcabdabcabcd) ab(cabdabcabcd) abc(abdabcabcd) abca(bdabcabcd) abcab(dabcabcd) abcabd(abcabcd)
P a(bcabcd) ab(cabcd) abc(abcd) abca(bcd) abcab(cd) abcabc(d)
(呀!!看我nextval。。。)
S abcabd(abcabcd)
P a(bcabcd) (关键部分)
(纳尼?我再来一次。。。)
S abcabda(bcabcd)
P a(bcabcd) (接下来我就不写了,最后就匹配了)
看到这里,请重点关注(关键部分),怎么样,是不是nextval比next牛逼一点(请看他们的区别)。
好了,话也不多说了,上代码。
1 void Get_next(string P,int* nextval) { 2 int i,j; 3 nextval[i = 0] = j = -1; 4 int len = P.length(); 5 while (i < len - 1) { 6 if (j == -1 || P[i] == P[j]) { 7 i++,j++; 8 if (P[i] == P[j]) { 9 nextval[i] = nextval[j];10 }11 else nextval[i] = j;12 }13 else j = nextval[j];14 }15 }
看到不同了吧,就是这么简单。
练习一下,P串 abcabcd 的nextval是多少?
nextval [0..7] = {-1,0,0,-1,0,0,3};
KMP改进(nextval)