Algorithm KMP算法的前缀表
我正在学习KMP算法。尽管这个算法很容易理解,但我有一个疑问 前缀表算法:Algorithm KMP算法的前缀表,algorithm,string-matching,Algorithm,String Matching,我正在学习KMP算法。尽管这个算法很容易理解,但我有一个疑问 前缀表算法: void prefixTable(char p[], int m){ int i=1, j=0, F[0] = 0; while(i<m){ if(p[i]==p[j]){ F[i]=j+1; i++; j++; }else if(j>0){ j=F[j-1];
void prefixTable(char p[], int m){
int i=1, j=0, F[0] = 0;
while(i<m){
if(p[i]==p[j]){
F[i]=j+1;
i++;
j++;
}else if(j>0){
j=F[j-1];
}else{
F[i]=0;
i++;
}
}
}
void前缀可压缩(字符p[],int m){
int i=1,j=0,F[0]=0;
while(i0){
j=F[j-1];
}否则{
F[i]=0;
i++;
}
}
}
如上图5所示,i=5,j=3,j=F[j-1]在j>0时执行
为什么我们要取F[j-1]?为什么不能直接使用F[0]?
它如何确保算法的正确性?j是模式中的位置 如果模式被处理到某个位置>0,那么如果模式包含其自身的前缀,则我们无法将模式移动到第一(0)个位置 应用于您的示例:模式为
ababaca
。尝试在文本中找到它abababaca
:
- 算法将处理文本,直到模式为
ababa|c
- 将j设置为F[0]=0,意味着将模式设置为
,这将永远不会匹配|ababac
(注意,我不会更改)baca
- 将j设置为F[4]=3,意味着将模式设置为
,这将匹配aba | bac
baca
- 匹配后,模式处于状态
,文本处于状态abababac |
,很明显找到的模式是ababababac | a
ab[abababac]a