§ 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 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 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)