串的模式匹配——KMP算法
2014-04-01 16:48
253 查看
KMP算法代码如下:
理解KMP算法的难点在于理解get_next函数,在上面代码可看到,当j==1,亦
即模式串第一个字符就与主串不匹配时,令next[1]=0;在Index_KMP函数中
,当j=next[1];亦即j值为0时,令j++,使得j值为1,而i不变,结果使得模
式串从第一个开始与主串比较。
从get_next函数可以看到,i的值范围为:1~T[0]-1;j值范围为:0~T[0]-2;
因此T[i]范围为:T[2]~T[T[0]-1];T[j]范围为:T[1]~T[T[0]-2];
get_next函数中,
else j=next[j];
该语句的意思为:当T[i]!=T[j]时,i不变,而j则回溯到next[j],亦即回
到满足T[1]~T[k-1]==T[j-k+1]~T[j-1]的k的位置,此时j==k;
还有值得一提的是,next[2]的值总为1,从get_next函数可以看出,具体如下:
if(j==0||T[i]==T[j])
{++i; ++j; next[i]=j;}
当j==0时,则++i;++j;-->i==2,j==1.
然后再执行next[2]=1;
get_next函数的改进
int Index_KMP(SString S,SString T,int pos) { i=pos;j=1; while(i<=S[0]&&j<=T[0]) { if(j==0||S[i]==T[j]) {++i;++j;} else j=next[j]; } if(j>T[0]) return i-T[0]; else return 0; } void get_next(SString T,int next[]) { i=1; next[1]=0; j=0; while(i<T[0]) { if(j==0||T[i]==T[j]) {++i; ++j; next[i]=j;//下一趟从T[j]与T[i]开始比较} else j=next[j]; } }
理解KMP算法的难点在于理解get_next函数,在上面代码可看到,当j==1,亦
即模式串第一个字符就与主串不匹配时,令next[1]=0;在Index_KMP函数中
,当j=next[1];亦即j值为0时,令j++,使得j值为1,而i不变,结果使得模
式串从第一个开始与主串比较。
从get_next函数可以看到,i的值范围为:1~T[0]-1;j值范围为:0~T[0]-2;
因此T[i]范围为:T[2]~T[T[0]-1];T[j]范围为:T[1]~T[T[0]-2];
get_next函数中,
else j=next[j];
该语句的意思为:当T[i]!=T[j]时,i不变,而j则回溯到next[j],亦即回
到满足T[1]~T[k-1]==T[j-k+1]~T[j-1]的k的位置,此时j==k;
还有值得一提的是,next[2]的值总为1,从get_next函数可以看出,具体如下:
if(j==0||T[i]==T[j])
{++i; ++j; next[i]=j;}
当j==0时,则++i;++j;-->i==2,j==1.
然后再执行next[2]=1;
get_next函数的改进
void get_nextval(SString T,int next[]) { i=1; next[1]=0; j=0; while(i<T[0]) { if(j==0||T[i]==T[j]) { ++i; ++j; if(T[i]!=T[j]) next[i]=j; else next[i]=next[j]; // } else j=next[j]; } }
相关文章推荐
- 模式匹配与KMP算法
- 改进的模式匹配算法——KMP算法
- 改进的模式匹配算法——KMP算法
- 字符串模式匹配----KMP算法
- KMP算法 KMP模式匹配 一(串)
- 数据结构_串_串的模式匹配_KMP算法_C++实现
- 串的模式匹配 经典KMP算法
- 字符串模式匹配——KMP算法
- 字符串模式匹配KMP算法
- 《柔性字符串匹配》读书笔记(1)之--KMP算法(单模式串匹配、前缀匹配)
- KMP算法模式匹配
- 字符串模式匹配KMP算法
- 算法1:字符串模式匹配KMP算法 源代码
- 改进的模式匹配算法——KMP算法
- 改进的模式匹配算法——KMP算法
- 【模式匹配】之 —— KMP算法详解及证明
- 数据结构- 串的模式匹配算法:BF和 KMP算法
- 串的模式匹配算法:BF和 KMP算法
- 今天学会了用于模式匹配的KMP算法,思路太精彩了!!
- 模式匹配――从BF算法到KMP算法