kmp算法next(j)怎么算出来的?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kmp算法next(j)怎么算出来的?相关的知识,希望对你有一定的参考价值。
int first=-1,last=0;len=strlen(ch);
while(last<len)
if(ch[first]==ch[last] || first==-1)
first++;last++;
next[last]=first;
else
first=next[first];
用自己和自己KMP然后得出next[]
最后的出来的就是next[]了,当然我这个next[]是初值为-1的,你书上写的应该是最大匹配值,就是将我的全部左移一位的结果 参考技术A 想帮你'但是我没上过大学''无能为力啊…
数据结构kmp算法中的next函数
kmp算法中next函数具体是怎样实现的,最好能举例分布说明
kmp策略:调整子串T的位置j,使得S[i-j+1,......i]与T[1,2,....j]保持匹配且新的S[i+1]与T[j+1]恰好匹配,否则j回移或移动i(使得S[i]=T[1]).直至j=T.length.匹配完成.
kmp算法的的流程大致理解了,但是关于next函数的求解,串的每个字符他的next[j]是如何计算出来的。以及他的优化算法nextavl的运行过程不是很懂,那位高手知道的可以解释一下.
void get_next(SString T,int next[])
i=1; next[1]=0; j=0;
while(i<T[0])
if(j==0||T[i]==T[j])
++i;++j;next[i]=j
else j=next[j];
void get_nextval(SString T,int nextavl[])
i=1; nextavl[1]=0; j=0;
while(i<T[0])
if(j==0||T[i]=T[j])
++i; ++j;
if(T[i]!=T[j])
nextavl[i]=j;
else nextval[i]=nextval[j];
else j=nextval[j];
(例:)下面为串aaaab的next计算值
j 1 2 3 4 5
T[] a a a a b
next[j] 0 1 2 3 4
nextval[j] 0 0 0 0 4
我想你还是不太了解KMP(其实我也不算很懂,尽量说吧O(∩_∩)O~交流下)
那个next其实是T串(字串)自己和自己匹配所得到的。
方法和S T匹配时一样,主不过以前是遇到不匹配时回到NEXT【j】,这个函数中则是遇到不匹配记录下不匹配的位置(说明前面得j个是后面串的后缀)。
至于您说的那个
tvalnext
我不清楚,你能发过来么?一起学习下。O(∩_∩)O~
以上是关于kmp算法next(j)怎么算出来的?的主要内容,如果未能解决你的问题,请参考以下文章