1. 程式人生 > 其它 >資料結構求next、nextval陣列演算法和KMP演算法

資料結構求next、nextval陣列演算法和KMP演算法

求next陣列的程式碼如下:

 1 int get_next(String T,int &next[])
 2 {    //求next陣列
 3     int i=1,j=0;
 4     next[1]=0;
 5     while(i<T.length)
 6     {
 7         if(j==0||T.ch[i]==T.ch[j])
 8         {
 9             ++i;++j;
10             next[i]=j;   //若pi=pj,則next[j+1]=next[j]+1
11         }
12         else
13 j=next[j]; //否則令j=next[j],迴圈繼續 14 } 15 }

求nextval陣列的程式碼如下:

 1 int get_nextval(String T,int &nextval[ ]){
 2 //求模式串T的nextval陣列。
 3     int i=1,j=0; nextval[1]=0; 
 4     while(i<T.length){
 5         if(j==0||T.ch[i]==T.ch[j]){
 6             ++i;++j;
 7             if (T.ch[i]!=T.ch[j]) nextval[i]=j;
8 else nextval[i]=nextval[j]; 9 } 10 else j=nextval[j]; 11 } 12 }//get_nextval

kmp演算法程式碼如下:

 1 int Index_KMP(String S,String T,int next[])
 2 {
 3     int i=1,j=1;
 4     while(i<=S.length&&j<=T.length)
 5     {
 6         if(j==0||S.ch[i]==T.ch[j])
7 { 8 ++i,++j; //繼續比較後續字元 9 } 10 else 11 j=next[j]; //模式串右移 12 } 13 if(j>T.length) 14 return i-T.length; //匹配成功 15 else 16 return 0; //匹配失敗 17 }