KMP中next[j]与nextval[j]直接求法

KMP中next[j]与nextval[j]直接求法

先看next[j]
上公式:
KMP中next[j]与nextval[j]直接求法_第1张图片
我们用一道例题讲解:
KMP中next[j]与nextval[j]直接求法_第2张图片
(1)先看j=1时,由公式知,next[j]=0。
(2)再看j=2时,由公式知,属于其他情况,next[j]=1。
(3)从j=3开始进入关键过程了,当j=3时,看j=3之前的字符串,即ab,从前面取一个,从后面取一个,或者从前面取两个,从后面取两个,以此类推,比较最多多少对相同的字符,next[j]就得(几+1),因为此时j=3,从前取一个a,从后取一个b,发现不同,则说明没有相同的字符,则属于公式中的其他情况,next[j]=1。
(4)j=5时,前面的字符串为abca,则从前取一个a,从后取一个a,发现相同,再从前面取两个,即ab,从后面取两个,即ca,发现不同,则说明有一对相同的字符,则属于公式中的第一种情况,next[j]=1+1=2。
(5)j=7时,前面的字符串为abcaab,则从前取一个a,从后取一个b,发现不相同,再从前面取两个试试看,即ab,从后面取两个,即ab,发现相同,再往多取发现不行了,则说明有两对相同的字符,则属于公式中的第一种情况,next[j]=2+1=3。

其他j的情况都是同理,自己算算看。
就酱求next[j]。

求nextval[j]:
公式:
KMP中next[j]与nextval[j]直接求法_第3张图片
还是通过这道例题讲解:
KMP中next[j]与nextval[j]直接求法_第4张图片
我们先来按照公式一步一步推导做:
(或者你可以直接翻到后面看简便算法,按公式推导是为了辅助理解)
(1)j=1时,由规定知:k=next[j]=next[1]=0;Tk(T以k为角标)的意思是字符串中第k个字符,此时发现Tj=T1=a,而Tk=T0,因为T0不存在,所以属于公式中的其他情况,所以nextval[j]=nextval[1]=next[j]=next[1]=0。
(2)j=2时,由规定知:k=next[j]=next[2]=1;此时发现Tj=T2=b,而Tk=T1=a,Tj不等于Tk,所以属于公式中的其他情况,所以nextval[j]=nextval[2]=next[j]=next[2]=1。
(3)j=9时,由规定知:k=next[j]=next[9]=1;此时发现Tj=T9=a,而Tk=T1=a,Tj等于Tk,所以属于公式中的第一种情况,所以nextval[9]=nextval[1]=0。

**********简便算法:
假设我们现在要求上面例题j=14时的nextval[j],我们首先看j=14时next[j]=多少,发现next[j]=6,就直接拿T4和T6比较一下相不相等就行了,相等nextval[14]就=nextval[6]
的值,不相等nextval[14]就=next[14]。

就酱求nextval[j]。

你可能感兴趣的:(字符串,数据结构,算法)