KMP算法分析

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

求特征向量Next

 1 int* Next(string p){
 2   int m=p.length(); 
 3   int *N=new int[m];
 4   N[0]=0;
 5   for(int i=1;i<m;i++){
 6     int k=N[i-1];
 7     while(k>0&&P[i]!=P[k])k=N[k-1];
 8     if(P[i]==P[k]) N[i]=k+1;
 9     else N[i]=0;
10   }
11   return N;
12 }

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

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

匹配的具体实现:

 1 int KMP(string T,string P,int *N,int startIndex){
 2   int lastIndex=T.length()-P.length();
 3   if((startIndex-lastIndex)>=0) return -1;
 4   int pt,pp=0;
 5   for(pt=startIndex;pt<T.length();pt++){
 6     while(P[pp]!=T[pt]&&pp>0) pp=N[pp-1];
 7     if(P[pp]==T[pt]) pp++;
 8     if(pp==P.length())return pt;
 9   }
10   return -1;
11 }    

分析:

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。