KMP算法的nextval[] 即优化next[]

  

  针对于next[]算法思路的考虑,其实在下标i失配时,比较下标i-1与前面的匹配情况找到最好匹配对象存在next[i]=j。当我们再比较T[i]、T[j],相等跳过匹配,不相等做该做的匹配操作。

下面是代码

 1 void getnextval_2(char T[],int nextval[]){//直接相当于舍弃next求法,直接求nextval,不借助next[],直接优化比较,并且直接递推下去; 教材的方法
 2     int i,j;
 3     i=0;
 4     j=-1;
 5     nextval[0]=-1;
 6 
 7     while(i<strlen(T)){
 8         if(j==-1||T[i]==T[j]){
 9             i++;
10             j++;
11 
12             /**///——>重点理解地带:直接在T[]上求nextval,同于next[]的思想
13             if(T[i]!=T[j]){   //前一个判断,求的与next一样,i++后,比较当前T[i]T[j]
14                 nextval[i]=j;//不等,存储入nextval
15             }
16             else{
17                 nextval[i]=nextval[j];//相等,不用比较,跳过;nextval是从头开始递推的,每个值都是最优的
18             }
19             /**/
20 
21         }
22         else{
23             j=nextval[j];
24         }
25     }
26 }
View Code

 

  其实本质上思路与求next[]的想法一致,就只是在应该赋值进入next时,做一次比较,T[i]、T[j],相等跳过匹配,不相等做该做的匹配操作。又由于基本算法是从递推关系出来的,相等,赋值前一个nextval[],不相等,直接赋值。

 

当若想借助next,求nextval

 

转载于:https://www.cnblogs.com/wssblogs/p/7711313.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值