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/