KMP算法的next数组

作者:silence、2012年5月19日

本文参考:Google,数据结构(C语言)
本人声明:个人原创,转载请注明出处


#include <cstdlib>
#include <iostream>
/*
Author : silence
Time : 2012/5/19
Description : KMP算法的next[] 
*/ 
using namespace std;
void next(char T[],int L,int next[])
{
//字符串指针 
int i =0;
//next[j]=k j表示最后一个匹配位置,k表示j的前k位和开头前K位匹配 
next[0]= -1;
int j =-1; 
while(i<L)
{
 if(j==-1||T[i]==T[j])
  {
   ++i;
   ++j;
   next[i] =j ;
  } 
  else
  j=next[j];        
}    
     
} 
void get_next(string s,int next[])

{
    int length=s.length();
    int i=0,j=-1;
    next[0]=-1;
    while(i<length)
    {
        if(j==-1||s[i]==s[j])  /*s[i]表示后缀的单个字符*/
                               /*s[j]表示前缀的单个字符*/
        {
            ++i;
            ++j;
            next[i]=j;
        }
        else
        j=next[j];  /*若j值不相同,则j值回溯*/
    }

}
int main(int argc, char *argv[])
{
    char T[] ={'a','b','c','d','a','b','c','e'};
    int nextarr[10];
    next(T,8,nextarr);
    for(int i = 0;i<8;i++)
    cout<<T[i]<<" ";
    cout<<endl;
    for(int i = 0;i<8;i++)
    cout<<nextarr[i]<<" ";
    cout<<endl; 

     string s = "abcdabce";
     get_next(s,nextarr);
     for(int i = 0;i<8;i++)
    cout<<nextarr[i]<<" ";
    cout<<endl; 

    system("PAUSE");
    return EXIT_SUCCESS;
}

       书上的代码:

void get_next(SString T, int &next[])				
{				
	//求模式串T的next函数值并存入数组next			
	i = 1; next[1] = 0; j = 0;			
	while (i < T[0])			
	{			
		if(j ==0 || T[i] == T[j])		
		{		
			++i; ++j; next[i] = j;	
		} 		
		else 		
		{		
			j = next[j];	
		}		
	}			
}				
1 当前i=20,j=8;表示p0-p7和p11-p19相等

2 T[20]==T[8] next[21]=9 增长一个

    2.1 T[20]!=T[8] j= next[8]=3,j=3 next[8]=3表示p0-p2等于p5-p7  T[8]!=T[3]  



T[8]和T[20]失配,但是next[20]=8也就是20之前的8位和开头的8位匹配,

 应该在20之后的8位继续查找匹配项,20之后的8项就是开头的8位

  j=next[8]表示在开头的8位查找  next[8]=3也就是头三位和8的前三位相等也就是和20之前的三位相等 所以next[21]=++j,增加一位            



                          
                                  

你可能感兴趣的:(数据结构,算法,String,Google,System,语言)