zoukankan      html  css  js  c++  java
  • kmp算法

      kmp算法,就是模式串匹配算法,但又不同于BF算法的。它和BF算法之间的最大区别在于,kmp算法在匹配前会对目标串进行一定的处理。会用到一个next数组用来存放,在匹配时第i个字符失配时应将目标串移动多少位。而第i个字符的next值时由前i-1个字符组成的字符串决定的。因为,第i个字符的next值是前i-1个字符组成的字符串的最大的相同前缀与后缀的字符数之和,所以next[0]=-1。在匹配的过程中,模式串中的指针不会回溯,而目标串中的指针的回溯是根据第i个失配字符的next值所决定的。

      求next函数的模板

      

    void get_next(char T[], int next[])
     {
      // 求模式串T的next函数值并存入数组 next。
      j = 0; next[0] = -1; k = -1;
      while ( T[j+1] != '' ) {
      if (k = = -1 || T[j] = = T[k])
       { ++j; ++k; next[j] = k; }
      else k = next[k];
      }
     } // get_next

    因为在S[i]和T[j]不等时,由于T[j]=T[k],则S[i]肯定也不等于T[k],也就是说,S[i]不应该再去和T[k]进行比较(因为纯粹是多余的),而应该直接和T[next[k]]进行比较。因此,当T[j]=T[k]时,应该直接取T[k]的next函数值作为T[j]的 next 函数值。

    void get_nextval(char T[], int next[])
     {
      // 求模式串T的next函数值并存入数组 next。
      j = 0; next[0] = -1; k = -1;
      while ( T[j+1] != '' ) {
       if (k = = -1 || T[j] = = T[k]) {
        ++j; ++k;
        if (T[j]!=T[k]) next[j] = k;
        else next[j] = next[k];
       } // if
       else k = next[k];
      } // while
     } // get_nextval

      kmp比较函数

       while(i<len_a&&j<len_b)
        {
            if(j==-1||a[i]==b[j])
            {
                i++;
                j++;
            }
            else
                j=next[j];
        }

  • 相关阅读:
    VC 常见问题百问
    python windows 环境变量
    Check server headers and verify HTTP Status Codes
    Where are the AES 256bit cipher suites? Please someone help
    outlook 如何预订会议和会议室
    安装Axis2的eclipse插件后,未出现界面
    windows 环境变量
    python 时间日期处理汇集
    openldap学习笔记(使用openldap2.3.32)
    set p4 environment in windows
  • 原文地址:https://www.cnblogs.com/hbutACMER/p/3872384.html
Copyright © 2011-2022 走看看