• 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

  • 相关阅读:
    labVIEW学习——属性节点
    MATLAB学习
    WinForm中键盘按键问题
    TextBox的智能感知
    使用脚本操作UpdatePanel中控件的问题
    DBNull.Value,null,String.Empty之间的区别和联系
    Hotmail如何对已经存在的邮件地址进行更改?
    第一个hibernate项目
    html静态实现左边导航右边显示链接页面
    Struts2学习
  • 原文地址:https://www.cnblogs.com/wssblogs/p/7711313.html
Copyright © 2020-2023  润新知