2015考研:计算机数据结构常用算法(四)?

第四章

KMP算法和朴素匹配算法的关键区别是解决主串指针I的回溯,原理如下。

设置主字符串S[]和模式字符串T[],比如比较到模式字符串的第j个字符。当主字符串指针I与模式字符串指针J相比较时,意味着它们前面的所有字符已经相应地相等。但是

接下来[j]=k定义为t 1 T2…TK-1 = = TJ-K+1tJ-K+2……TJ-1和K最大,不再有一个。

所以当Si和Tj不能比较时,Si和Tk就可以比较。不可能有这么成功的匹配,因为S2S3...Si-1 = = T2T3...TJ-1和T2T3...TJ-1不等于T1t2...TJ-2。除非next[j]=j-1因为next的定义最长。因此,任何移位小于next[j]的字符串匹配都不可能成功。直到Tnext[j]与S[i]比较,才是最早可能的成功。

Int KMP_Index(Sstring S,Sstring T,int pos)

i=posj=1

while(我& lt= S[0]& amp;amp & ampampj & lt=T[0])

If(j=0||S[i]=T[j])//j=0表示模式串退到了起点,也就是说在这个位置完全不可能。

++i ++j //i必须下移,J返回1。

Else j=next[j]

if(j & gt;T[0])返回i-T[0]

否则返回0

寻找next的方法和原则[j]

设k=next[j]那么t 1 T2…TK-1 = = TJ-K+1…TJ-2tj-1。

如果Tj= =Tk,那么t 1 T2…Tk-1tk = = TJ-K+1…TJ-2tj-1tj。

所以下一个[j+1] = k+1 =下一个[j]+1和t1t2...tk-1 = = TJ-k+1...TJ-2tj-6558。

最长的序列,所以k+1也是next的最长[j+1]。

如果Tj不等于Tk,那么你需要重新找到它。即...TJ-1TJ?,

T1T2…

所以next[j+1] first =k=next[j],也就是...TJ-1TJ?,

T1T2…Tk-1。

如果不相等,那么next[j+1]=next[k],即...TJ-1TJ?,

T1T2…Tnext[k]-1

直到找到这样的序列,即...TJ-1TJ?,

T1T2...到

然后,next[j+1]= next[next[j]]= next[next[j]]...= o+1。

Void get_next(Sstring T,int next[])

I=1 next[1]=0 j=0//i表示目前要找的next。

而(我

if(j=0 | | T[i]=T[j])

++i

++j

next[i]=j

Else j=next[j]

因为next[]在匹配过程中,如果T[ j ]=T[ next[j]],那么当S[i]不等于T[ j ]时,

S[ i]肯定不等于T[k= next[j]]

所以S[i]应该直接和T[next[k]]比较,我们修正了next[j]。

对于nextval[j]=next[next[j]],这可以减少比较。

Void get_nextval(Sstring T,int nextval[])

i=1 nextval[1]=0 j=0

而(我

if(j=0 || T[i]= T[j])

++i

++j

if(T[i]!=T[j])

nextval[i]=j

其他

nextval[i]=next[j]

其他

j=nextval[j]

空格字符串是指由空格字符(ASCII值32)组成的字符串,其长度等于空格的个数。

在模型试验匹配的KMP算法中使用的失效函数f的定义中,为什么要求P1p2...PF (j)是P1p2的真实子串...两端匹配的PJ?并且是最大的真子串。

失败函数(即next)的值只取决于模式字符串本身。如果第j个字符与主字符串的第I个字符不匹配,主字符串不会回溯。与第I个字符相比,模式字符串的第k个字符有' p 1…PK-1 ' = ' pj-k+65438+。这样,由于j-k最小,即模式串向右滑动的位数最小,避免了右移造成的可能匹配的损失。

以上是第四章的数据结构算法。希望考生能把这些算法背下来,方便以后考试应用和实际操作。最后祝大家考试成功!

推荐阅读:

2015考研:计算机数据结构常用算法总结

如果你对考研有疑问,不知道考研中心的内容怎么总结,不了解考研报名的地方政策,点击最下方咨询官网,免费获取复习资料:/xl/