int KMPMatch char T char P T0P0 nT0

  • Slides: 33
Download presentation

int KMPMatch ( char T[] , char P[] ) { //T[0]和P[0]分别表示长度 n=T[0] ; m=P[0]

int KMPMatch ( char T[] , char P[] ) { //T[0]和P[0]分别表示长度 n=T[0] ; m=P[0] ; //长度 i=j=1; //开始 t 1~p 1 while (i<=n && j<=m) if (T[i]==P[j]) { i++; j++; //继续比较下一位 } else { //ti≠ pj k=next[j]; if (k>0) j=k ; //比较ti和pk: ti~pk else { j=1; i++; } //比较ti+1和p 1: ti+1~p 1 } //endif,endwhile if (j>m) //匹配成功 return i-m; //注意成功时,i和j均多加了1 else return 0; //匹配失败 20 }

§ 4. 3 模式匹配算法 void Get. Next (char p[] , int next[]) { //求模式串P的next数组(递推法)i-主串指针

§ 4. 3 模式匹配算法 void Get. Next (char p[] , int next[]) { //求模式串P的next数组(递推法)i-主串指针 i=1; j=0; next[1]=0; m=P[0]; //模式串长度 while (i<m) //求next[i+1] if (j==0) next[++i]=++j; //next[i+1]=1 else //j>0 if (P[i]==P[j]) next[++i]=++j; //next[i+1]=j+1 else //pi≠pj j=next[j]; } //可改进为书上一样的算法 28

§ 4. 3 模式匹配算法 即可用下述方式节省时间: 当pj=pk时,将next[j]置为next[k] 此过程可重复! 例: j 1 2 3 4 5

§ 4. 3 模式匹配算法 即可用下述方式节省时间: 当pj=pk时,将next[j]置为next[k] 此过程可重复! 例: j 1 2 3 4 5 j P next[j] nextval[j] P a a b 1 a next[j] 0 1 2 3 4 2 a 0 1 0 0 ti≠p 2, 比较ti~pnext[2] ∵p 2=p 1, next[2] ←next[1] ti ≠p 3, ti~pnext[3], ∵p 3=p 2∴next[3]←next[2] 改进 nextval[j] 0 0 4 3 a 2 0 pj p 2 p 3 p 4 p 5 4 a 3 0 pk p 1 p 2 p 3 p 4 5 b 4 4 30

§ 4. 3 模式匹配算法 n 求nextval算法 与书上不一样的算法,请比较 void Get. Next. Val (char P[], int

§ 4. 3 模式匹配算法 n 求nextval算法 与书上不一样的算法,请比较 void Get. Next. Val (char P[], int nextval[]) { //求nextval i=1; j=0; nextval[1]=0; m=P[0]; while (i<m) { //已知nextval[i],求nextval[i+1] while (j>0 && P[i] != P[j]) j=nextval[j]; // 出循环时j=0或P[i]=P[j] i++; j++; if (P[i] ==P[j]) nextval[i] = nextval[j]; // 性质 5 else nextval[i] = j; // nextval[i+1] = j+1 } } 31 时间仍为O(m)