KMP算法分析

时间:2023-03-08 21:37:43

KMP是一种复杂度较低的字符串比较算法。基本思路是对欲匹配字符串进行预处理,分析当k位匹配时可以后移的位数,所得的数构成该字符串的特征向量。

求特征向量Next

 int* Next(string p){
int m=p.length();
int *N=new int[m];
N[]=;
for(int i=;i<m;i++){
int k=N[i-];
while(k>&&P[i]!=P[k])k=N[k-];
if(P[i]==P[k]) N[i]=k+;
else N[i]=;
}
return N;
}

分析:边界N[0]=0;

   从第1位开始向后构造N[i]:设临时变量k,令k为i-1位匹配时后移位数,如果第i位和第k为不匹配,k向前回溯,直到匹配或者k=0无法后移。处理后如果k位和i位匹配,N[i]则可在k匹配后后移1位,否则无法后移,N[i]=0

匹配的具体实现:

 int KMP(string T,string P,int *N,int startIndex){
int lastIndex=T.length()-P.length();
if((startIndex-lastIndex)>=) return -;
int pt,pp=;
for(pt=startIndex;pt<T.length();pt++){
while(P[pp]!=T[pt]&&pp>) pp=N[pp-];
if(P[pp]==T[pt]) pp++;
if(pp==P.length())return pt;
}
return -;
}

分析:

  比较时一旦现有指向不匹配,pp立刻转回前一位继续与pt进行匹配,直到匹配上或者边界。匹配上则pp++进行下一位匹配。