• KMP算法研究 - [个人研究]

    2009-05-08

    分类: 个人研究

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://skyofcai.blogbus.com/logs/39088627.html

                                KMP算法研究

     

      KMP算法,网上有很多版本,我看了一些,大都不太满意。所以自己写了一个,跟网上的都不一样。但KMP算法的思路肯定是一样的(毕竟这算法是人家想出来的,我只是用了我个人的风格去实现,愿多提宝贵意见)。

        其实KMP算法很简单,书上和网上的讲解大多都力求精细,我觉得这只能做个参考。初学者一般还是要有人来点拨和自己揣摩。现在,我搞懂了KMP算法,我就可以说出KMP算法的要害。好啦,废话少说,转入正题。

        KMP算法的要害就是: GetNext()函数。它就是要获取下一个要比较的模式串中的位置。抓住这个要害不动摇,继续深究,KMP算法就逐渐明朗大白了。

        具体算法分析,网上有很多,我这里指点拨,就不去复制网上的东西了(互联网上的数据冗余太多了,我不能火上浇油,制造太多垃圾)。如果读者有什么不懂的问题,可以评论的方式和我互动交流。

     

     

     

    代码实现:

    (声明: 该代码经过测试,但不能排除一切bug。任何人使用且发现bug并造成的一切损失,将由使用本代码者承担全部责任,而本作者不承担任何责任。该代码仅供学习交流。若能将bug报告给本作者,在下会感激不尽。)

     

    #include <stdio.h>

    #include <string.h>

    int TrueSubStr(const char *s, int j);      //判别真字串,返回非0为真字串

    int GetNext(const char *s, int j);        //获取下一个指针

    int KMP(const char *s, const char *t);    //KMP算法主体,返回主串中的位置

    int main(void)

    {

          int k;

          k = KMP ("faskjfsf", "jfa");

          printf ("%d\n", k);

          return 0;

    }

    int TrueSubStr(const char *s, int n)

    {

          int k = 0;

          while (k<n)  // 0 < k < n

               if (s[k] == s[n-k])

                     k++;

               else

                     break;

          return k;

    }

     

    int GetNext(const char *s, int j)

    {

          if (j == 0)

               return -1;

          return TrueSubStr(s, j);

    }

     

    int KMP(const char *s, const char *t)

    {

          int i = 0;   //is

          int j = 0;   //jt

          int k = 0;   //k指模式串中下一个带比较的位置

          while (s[i] != '\0' && t[j] != '\0')

          {

               if (s[i] == t[j])

               {

                     i++;

                     j++;

               }

               else

               {

                     if (j == 0)

                          i++;

                     else if ( (k = GetNext(t,j)) != 0)

                          j = k;

                     else

                     {

                          i++;

                          j = 0;

                     }

                    

               }

          }//while

          if (t[j] == '\0')

               return (i-j);

          return -1;

    }//KMP


    历史上的今天:

    嫉妒 2009-05-08
    专注 2009-05-08

    收藏到:Del.icio.us