计算机考研:数据结构常用算法分析(四)?
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;& ampj & lt=T[0])
{
If(j=0||S[i]=T[j])//j=0表示模式串退到了起点,也就是说在这个位置完全不可能。
{ ++ I;++ j;}//我必须下移,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;
所以next[j+1]= k+1 = next[j]+1;和t1t2...TK-1 = = TJ-K+1...TJ-2tj-1已经是。
最长的序列,所以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;接下来[1]= 0;j = 0;//i代表当前的下一个。
而(我
{
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最小,即模式串向右滑动的位数最小,避免了右移造成的可能匹配的损失。
第四章为大家分析数据结构算法。希望考生能把这些算法背下来,方便以后考试应用和实际操作。祝大家成绩好。加油!
更多详情请点击:计算机考研:数据结构常用算法分析总结。
如果你对考研有疑问,不知道考研中心的内容怎么总结,不了解考研报名的地方政策,点击最下方咨询官网,免费获取复习资料:/xl/