最近在看软件设计师教程,其中有一个KMP算法,让求出其next值。书上和网上给出的好多都是别人优化过的算法代码,看起来比较恶心,(不过人家那短短几行代码,却实现了这样一个算法,实在是佩服!!!)网上看了好多别人写的KMP算法中next值得求解,好多都是讲原理的,理解起来比较费时,此文仅献给那些快要考试的孩纸们~

用例子说话:

求子串: a  b  a  a  b  c  a  c的next值

 

位置:        0   1   2   3   4   5   6   7

子串:        a   b   a   a   b   c   a    c

next值:    0   1   1   2   2   3   1   2

 

首先前两位一定为0和1接下来看后面几位

 

第三位(a):看第二位next值是1,将第二位的b与第一位a相比,不同,则为1(如果相同,则为第二位的next值+1)

第四位(a):看第三位next值是1,将第三位的a与第一位的a相比,相同,则为第三位的next值+1=2

第五位(b):看第四位next值是2,将第四位的a与第二位的b相比,不同,而第二位的next值是1,再将第四位的a与第一位的a相比,相同,将第二位的next值+1=2

第六位(c):看第五位的next值是2,则将第五位的b与第二位的b相比,相同,则将第五位的next值+1=3

第七位(a):看第六位的next值是3,将第六位的c与第三位的a相比,不同,而第三位的next值是1,则将第六位的c与第一位的a相比,不同,为1(如果第六位与第一位相比,相同的情况下,第七位的next值应该是第三位的next值+1=2)

第八位(c):看第七位的next值是1,将第七位的a与第一位的a相比,相同,则将第七位的next值+1=2

 

自己研究了半天,到最后代码也记住了,这里附上恶心的代码(next)~~~

 

void Get_next(char *p, int next[]){

         int  i , j , slen;

         slen = strlen(p);

         i= 0;

         next[0] = -1;

         j = -1;

         while(i <slen){

                   if(j == -1 || p[i] == p[j]) {

                            ++i ;

                            ++j ;

                            Next [i]=j ;

                   }else{

                            J = next[j] ;

                   }

}

   

     这个仅仅是用来应付考试的,不过有时间还是好好研究下KMP算法吧,好东西就是好东西,学会了以后说不准就有用!!!看软件设计师的时候,里面好多算法都不会,像什么堆排序,直接插入排序,回溯法什么的···基本都是严蔚敏那本《数据结构》上的,好后悔自己当时上课没听,都睡觉了~~~~

顺便附上我自己看KMP算法是比较好的博客:

http://www.cnblogs.com/tangzhengyue/p/4315393.html

posted on 2016-05-17 11:46  晨三少  阅读(4489)  评论(0编辑  收藏  举报