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

来源:互联网 发布:使用excel制作数据库 编辑:程序博客网 时间:2024/04/30 16:15

串的朴素的模式匹配算法:
对主串的每一个字符作为子串的开头,与要匹配的字符串进行匹配。对主串做大循环,每个字符开头做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值回溯}}




1 0
原创粉丝点击