【发布时间】:2016-08-16 18:33:12
【问题描述】:
我正在通过 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];
}else{
F[i]=0;
i++;
}
}
}
如上图步骤 5 所示,i=5, j=3, j=F[j-1] 被执行为 j>0 。
我们为什么要取 F[j-1]?为什么我们不能直接使用 F[0]? 它如何保证算法的正确性?
【问题讨论】:
-
扫描直接出自 Narasiha Karumanchi 的书 Data Structures And Algorithms Made Easy。这是一本精彩的读物!