串的模式匹配——KMP算法

KMP算法代码如下:
int Index_KMP(SString S,SString T,int pos)
{
    i=pos;j=1;
   while(i<=S[0]&&j<=T[0])
   {
     if(j==0||S[i]==T[j]) {++i;++j;}
     else j=next[j];
   }
   if(j>T[0])   return i-T[0];
   else  return 0;
}


void get_next(SString T,int next[])
{
   i=1;  next[1]=0;  j=0;
   while(i<T[0])
   {
     if(j==0||T[i]==T[j]) 
     {++i;  ++j;  next[i]=j;//下一趟从T[j]与T[i]开始比较}
     else   j=next[j]; 
   }
}

 理解KMP算法的难点在于理解get_next函数,在上面代码可看到,当j==1,亦

即模式串第一个字符就与主串不匹配时,令next[1]=0;在Index_KMP函数中
,当j=next[1];亦即j值为0时,令j++,使得j值为1,而i不变,结果使得模

式串从第一个开始与主串比较。


 从get_next函数可以看到,i的值范围为:1~T[0]-1;j值范围为:0~T[0]-2;
因此T[i]范围为:T[2]~T[T[0]-1];T[j]范围为:T[1]~T[T[0]-2];
get_next函数中,
 else   j=next[j]; 

 该语句的意思为:当T[i]!=T[j]时,i不变,而j则回溯到next[j],亦即回
到满足T[1]~T[k-1]==T[j-k+1]~T[j-1]的k的位置,此时j==k;
还有值得一提的是,next[2]的值总为1,从get_next函数可以看出,具体如下:
    if(j==0||T[i]==T[j]) 
     {++i;  ++j;  next[i]=j;}
当j==0时,则++i;++j;-->i==2,j==1.

然后再执行next[2]=1;

get_next函数的改进

void get_nextval(SString T,int next[])
{
   i=1;  next[1]=0;  j=0;
   while(i<T[0])
   {
     if(j==0||T[i]==T[j]) 
     {
        ++i;  ++j; 
        if(T[i]!=T[j]) next[i]=j;
        else     next[i]=next[j]; //    
     }
     else   j=next[j]; 
   }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值