KMP模式匹配算法

来源:互联网 发布:超星数据库 编辑:程序博客网 时间:2024/06/05 22:40

       KMP算法可以说是朴素的匹配模式的优化,由于朴素的模式匹配算法中其实实现了很多没有必要的比较,所以在KMP中,加以改善。比如T=“abcabcabc”,子串S="abcabx",

当tindex=5,sindex=5时,才发现不匹配,按朴素匹配算法,tindex需要回退到tindex=1的位置。但实际上,我们可以直观的看到,abcabx中的abcab已经匹配,而S子串首位是a,所以我们只需要让sindex回退到sindex=3的位置,tindex不变即可,没必要回退到1的位置再进行不必要的循环匹配。由此,我们可以得到一个规律:回退的位置取决于当前字符之前的串的前后缀的相似度。    

         由此,引出next[]数组来专门保存j应该回退到什么位置 。(以下代码中,0下标均保存的是长度)

          void get_next(String S,int *next)

          {

                 int i,j;

                 i=1;

                 j=0;

                 next[1]=0;

                 while(i<S[0])

                 {

                        if(j==0 || S[i]==S[j])

                        {

                             ++i;

                             ++j;

                             next[i]=j;

                        }

                       else

                       {

                              j=next[j];

                       }          

                 }       

          }

          int  Index_KMP(String T,String S,int pos)

          {

                 int i=pos;

                  int j=1;

                 int next[255];

                 get_next(S,next);

                 while(i<=T[0] && j<=S[0])

                 {

                         if(j==0 || T[i]==S[j])

                         {

                                 ++i;

                                 ++j;

                         }

                         else

                          {

                                 j=next[j];

                          }

                 }

                 if(j>S[0])

                 {

                          return i-S[0];

                 }

                 else

                 {

                          return 0;

                 }

          }

原创粉丝点击