KMP算法之最终实现及 NEXT数组的优化
2013-04-02 09:28
211 查看
让编程改变世界
Change the world by program
http://blog.fishc.com/2303.html
搞定了NEXT数组,KMP算法就易如反掌了。
一起来完成:kmp.c
后来有人发现,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;
}
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;
}
相关文章推荐
- KMP算法的Java实现(优化和非优化求next数组)
- 字符串模式匹配之KMP算法图解与 next 数组原理和实现方案
- KMP算法中NEXT数组的作用以及代码实现
- KMP算法与next数组的代码初步实现
- 字符串匹配问题——求给定字符串的next数组以及KMP算法实现
- KMP算法理解与next数组的实现
- KMP算法中next数组的理解与算法的实现(java语言)
- KMP算法的next、next value数组代码实现及POJ3461
- KMP模式匹配算法原理分析、next数组优化及java实现
- KMP算法next数组计算方法的优化
- KMP算法之最终实现及优化 - 数据结构和算法39
- POJ 2406 KMP算法next数组理解
- KMP算法之最终实现及优化 – 数据结构和算法39
- KMP算法求next数组和nextval数组的简单方法
- KMP算法的前缀next数组最通俗的解释,如果看不懂我也没辙了
- 模式匹配算法----KMP算法以及next数组的解法
- 转载大神的~~~~~~ KMP算法的前缀next数组最通俗的解释,如果看不懂我也没辙了
- poj 2752 KMPnext[]数组的理解 以及 两种优化
- KMP字符串快速匹配(next数组优化 有限状态自动机)
- 字符串匹配KMP算法中Next[]数组和Nextval[]数组求法