您的位置:首页 > 其它

KMP算法之最终实现及 NEXT数组的优化

2013-04-02 09:28 211 查看
让编程改变世界
Change the world by program
 

http://blog.fishc.com/2303.html

KMP算法之最终实现及优化

 

搞定了NEXT数组,KMP算法就易如反掌了。

一起来完成:kmp.c

 

KMP模式匹配算法改进

 

后来有人发现,KMP算法是有缺陷的。比如我们的主串 S =“aaaabcde”,子串 T =“aaaaax”,其中很容易得到next数组为012345。

那么我们看以下比较图:





上述NEXT数组为 0 1 2 3 4 5

但上述数组不科学,效率不高。NEXT要回溯到底:

NEXT 数组为 0 0 0 0 0 5

也就是在C语言以0为标号开始的处理方式中

NEXT -1 -1 -1 -1 -1 4

总和之前所有代码有如下的实现完整的KMP算法:

#define N 100
int next
;
int getNext(char *des)
{
int i;//i为串的后缀
int j;//j为串的前缀
i=0;
j=-1;
next[i]=-1;
while(i<strlen(des)-1)
{
if(j==-1||des[i]==des[j])
{
i++;j++;//前缀和后缀后移
//next[i]=j;//无优化
if(des[i]!=des[j])
{
next[i]=j;
}
else
next[i]=next[j];//回溯到底
}
else
{//前缀回溯
j=next[j];
}
}
return i;
}
int index_KMP(char* src,char* des)
{
int i;//src索引
int j;//des 模式串的索引
i=0;j=0;
getNext(des);
while(i<(int)strlen(src)&&j<(int)strlen(des))
{
if(j==-1||src[i]==des[j])
{
i++;
j++;
}
else
{
j=next[j];
}
}
int t=strlen(des)-1;
if(j>t)
{
return i-j;
}
return -1;
}
int _tmain(int argc, _TCHAR* argv[])
{
char* des=new char[100];
char* str="aaaaax";
strcpy(des,str);
char* src=new char[100];
char* strt="abababacaabacc";
strcpy(src,strt);
int index=index_KMP(src,des);

if(index!=-1){
for(int i=0;i<=strlen(des)-1;i++)
{
printf("%c",src[i+index]);
}
}
else
{
printf("not Find");
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: