KMP算法求next数组的一些理解
2017-08-06 17:44
302 查看
看了一天的KMP算法,终于对其有所理解,下面是对该算法的理解,希望对初学该算法的同学有所帮助。
net函数的求解
先看算法:
对于这个算法的难点在于,如果对于下一个next值(其中 p[i]!=p[j]的情况)该怎样求解
即我们已知next[i] = k,同时p[k]!=p[i],求next[i+1]
由此我们可知:p[i1] =p[i-k+i1] i1 = 0,,,k-1
既然p[k]!=p[i]
那么,next[i]的最大值只可能是next{k} +1,为什么,让我们来证一下。
证明:
既然p[k]!=p[i],那么,要想找到对称串,与p[i]相等的也只能在索引k前面找了。(不然,next(i)就大于k了)
我们设p[i2] = p[i]那么此时显然{p[0],p[1],…,p[i2]}就是我们要找的对称串,则next(i+1)=i2+1
则,由此推论:p[i1]=p[i-i2+i1] (i1=0,1,…i2-1)
又因为p[i1] =p[i-k+i1] i1 = 0,,,k-1(上面的条件),
可以知道p[i-i2+i1]=p[i-k+i1](i1=0,1,…,i2-1)
进而可知p[i1] = p[k-i2+i1] (i1=0,1,…,i2-1)
则{p[0],p[1],…,p[i2-1]就是{p[0],p[1],…,p[k-1]}的对称串
即next(k) = i2则next(i+1) = next(k)+1
故得证
因此,如果不是相应的next(k)+1,那只能继续从字串的字串中找了。
net函数的求解
先看算法:
public static int[] getNext(int[] p) { int i,j,slen; slen = p.Length; int[] next = new int[slen]; netxt[0] = -1; j = -1; while(i<slen) { if(j==-1||p[i]==p[j]) { ++i,++j,next[i]=j; } else { j = next[j]; } } return next; }
对于这个算法的难点在于,如果对于下一个next值(其中 p[i]!=p[j]的情况)该怎样求解
即我们已知next[i] = k,同时p[k]!=p[i],求next[i+1]
由此我们可知:p[i1] =p[i-k+i1] i1 = 0,,,k-1
既然p[k]!=p[i]
那么,next[i]的最大值只可能是next{k} +1,为什么,让我们来证一下。
证明:
既然p[k]!=p[i],那么,要想找到对称串,与p[i]相等的也只能在索引k前面找了。(不然,next(i)就大于k了)
我们设p[i2] = p[i]那么此时显然{p[0],p[1],…,p[i2]}就是我们要找的对称串,则next(i+1)=i2+1
则,由此推论:p[i1]=p[i-i2+i1] (i1=0,1,…i2-1)
又因为p[i1] =p[i-k+i1] i1 = 0,,,k-1(上面的条件),
可以知道p[i-i2+i1]=p[i-k+i1](i1=0,1,…,i2-1)
进而可知p[i1] = p[k-i2+i1] (i1=0,1,…,i2-1)
则{p[0],p[1],…,p[i2-1]就是{p[0],p[1],…,p[k-1]}的对称串
即next(k) = i2则next(i+1) = next(k)+1
故得证
因此,如果不是相应的next(k)+1,那只能继续从字串的字串中找了。
相关文章推荐
- 对kmp算法next数组的一些简单理解
- KMP算法中next数组的理解与算法的实现(java语言)
- poj 2406:Power Strings(KMP算法,next[]数组的理解)
- POJ 2406 KMP算法next数组理解
- Seek the Name, Seek the Fame(KMP算法之next数组的深入理解实例)
- KMP算法:KMP算法个人理解+next数组细节处理的方法
- KMP算法理解与next数组的实现
- poj 2406 kmp算法巩固之next数组的再理解
- 超详细理解:kmp算法next数组求解过程和回溯的含义
- KMP算法next数组通俗理解,适合考研及基础学习者
- POJ 3461 Oulipo 深刻理解KMP算法next数组含义
- 字符串匹配——KMP算法中的next数组理解
- KMP算法 一般详解,NEXT数组 一般理解 k = next[k] ——综合转载
- HDU 3336 KMP算法中对next数组的理解
- 字符串匹配的KMP算法---理解next数组的意义
- KMP算法next数组计算的理解——菜鸟福音
- KMP算法Next数组计算
- dutacm.club_1087_Common Substrings_(KMP)_(结合此题通俗理解kmp的next数组)
- KMP算法的前缀next数组最通俗的解释
- kuangbin专题十六 FZU1901 考察next数组的理解