您的位置:首页 > 理论基础 > 数据结构算法

数据结构(关于串的KMP匹配算法及其改进)

2016-12-04 14:01 786 查看
串的朴素的模式匹配算法:

对主串的每一个字符作为子串的开头,与要匹配的字符串进行匹配。对主串做大循环,每个字符开头做T的长度的小循环,直到匹配成功或全部遍历完成为止。例:S=“goodgoogle”T=“google”。

int Index(String S,String T,int pos)
//返回子串T在主串S中第pos个字符之后的位置。S[0] T[0]代表字符串的长度
{
int i=pos;//i用于主串S中当前位置下标,若pos!=1,则pos从当前位置开始匹配
int j=1;//j用于子串T当前位置下标值
while(i<=s[0]&&j<=T[0])
{
If(S[i]==T[j])
{
++i;
++j;
}
else //指针后退重新开始匹配
{
i=i-j+2;//i退回到上次匹配的首位的下一位
j=1;
}
}
If(j>T[0])
return i-T[0];
else
return 0;
}此算法的时间复杂度为O((n-m+1)*m)

KMP模式匹配算法:

1、T串中各个位置的j值定义一个数组next,next的长度为T串的长度

Next数组值推导:

j=123456

T=abcdex

N[j]=011111

   j=123456789

   T=ababaaaba

N[j]=011234223

2.KMP模式匹配算法实现

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

int index_KMP(String T,String S,int pos)
{
int i=pos;//i用于主串S中当前位置下标,若pos!=1,则pos从当前位置开始匹配
int j=1;//j用于子串T当前位置下标值
int next[255];
get_next(T,next);
while(i<=s[0]&&j<=T[0])
{
If(j==0||S[i]==T[j])
{
++i;
++j;
}
else //指针后退重新开始匹配
{
j=next[j];//j退回到合适的位置,i不变
}
}
if(j>T[0])
return i-T[0];
else
return 0;
}


时间复杂度为O(m+n)

对next函数进行改良,取代的数组为nextval

void get_nextval(String T,int *nextval)
{
int i,j;
i=1;
j=0;
nextval[1]=0;
while(i<T[0])
{
if(j==0||T[i]==T[j])//T[i]表示后缀的单个字符,T[j]表示前缀的单个字符
{
++i;
++j;
if(T[i]!=T[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j]; //若字符不相同,则j值回溯
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐