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

第四章

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/