数据结构复习-串

串没什么好复习了,重点就是KMP算法的性质和应用,接下来好好重温KMP算法

1.KMP算法概述

D.E.Knuth,J.H.Morris和V.R.Pratt同时发现的改进的模式匹配算法简称为KMP算法。

2.原始算法

int Index(String S,String T,int pos)//参考《数据结构》中的程序 { i=pos -1;j=0; while(i<=S.Length && j<=T.Length) { if(S[i]==T[j]){++i;++j;}//相同的话向下指 else{i=i-j+2;j=0;}//回溯 } if(j>T.Length) return i-T.Length;//匹配成功 else return 0; }

原始算法是两个串逐次比较

 注意这里:

i=i-j+2

它是把主串指针i也回溯到下一个比较的地方,其实如果自己动手比一下就知道,如果主串和模式串在第N个位置比较后发现不同,需要回溯时,主串和模式串的前面比较的值是相同的,这里说得比较含糊,要说的话需要写一大堆上下标,看书比较实际;所以,可以根据模式串和主串在发生比较不同的时候,前面N-1次是相同的原理,我们可以根据模式串找出下一次要比对的位置

             -1   如果j=0
next[j]={Max{k|0<k<j且'p1...pk-1'='pj-k+1...pj-1'
             0   其它情况

算法:

/*KMP模式匹配,求串p在主串s从第pos个字符开始的位置*/ int Index_KMP (CSTR s,CSTR p,int pos,int next[]) { int i,j,slen,plen; i = pos - 1; //主串指针 j = -1; //搜串指针 slen = strlen(s); plen = strlen(p); while((i < slen) && (j < plen)) { if(j == -1 || s[i] == p[j]) //匹配 { ++i; ++j; } else j = next [j]; } if(j >= plen) return i - plen; else return -1; }

 

Get_next函数:

/*Next值求法*/ void Get_next(CSTR p,int next[]) { int i,j,plen; plen = strlen(p); i = 0; next[0] = -1; j= -1; while(i < plen) { if(j ==-1||p[i]==p[j]) { ++j; ++i; next[i]=j; } else j = next[j]; } } /*改良的next求法*/ void Get_nextval(CSTR p,int nextval[]) { int i = 0; int j = -1; int slen = strlen(p); nextval[0] = -1; while(i <= slen) { if(j ==-1 || p[i]==p[j]) { ++i; ++j; /*改进之处*/ if(p[i] != p[j]) nextval[i] = j; else nextval[i] = nextval[j]; //消去多余的可能的比较,next再向前跳 } else j = nextval[j]; } }

你可能感兴趣的:(数据结构,算法,String)