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];
        }

  • 相关阅读:
    Oracle数据库实例的启动及关闭
    SCJP之赋值
    fileupload组件之上传与下载的页面
    commons-fileupload-1.2.1.jar 插件上传与下载
    SCJP读书之知识点:
    filter
    抽象abstract
    搞定导致CPU爆满的“罪魁祸首”
    优化一个小时不出结果的SQL
    最具戏剧性的分析诊断案例——十分钟锁定数据库性能“元凶”
  • 原文地址:https://www.cnblogs.com/hbutACMER/p/3872384.html
Copyright © 2011-2022 走看看