我被要求了解KMP DFA,我在书中发现的是实现,但我们的讲师一直都在调用某些“前缀函数”。我真的不明白哪个部分是这个功能,有人可以向我解释吗?对不起,如果有人问我,但我找不到它。KMP DFA前缀函数
public class KMP {
private String pat;
private String t;
private int[][] fsm;
public static final int ALPHABET = 256;
public KMP(String pat) {
this.pat = pat;
char[] pattern = pat.toCharArray();
int M = pattern.length;
fsm = new int[ALPHABET][pattern.length];
fsm[pattern[0]][0] = 1;
for(int X = 0, j = 1; j < M; j++) {
for(int c = 0; c < ALPHABET; c++) {
fsm[c][j] = fsm[c][X];
}
fsm[pattern[j]][j] = j + 1;
X = fsm[pattern[j]][X];
}
display(fsm);
}
public void search(String t) {
char[] text = t.toCharArray();
this.t = t;
int N = text.length;
int M = pat.length();
int i, j;
for(i = 0, j = 0; i < N; i++) {
j = fsm[t.charAt(i)][j];
if(j == M) {
System.out.println("Found at " + (i - M + 1));
j = 0;
}
}
}
谢谢,但据我所知存在KMP算法的两个版本(不过我可能是错的),你给我的链接称为标准算法,我已经实现了它,第二个是我知道FSM/DFA--这就是我的讲师所说的。我感到困惑:P – ashur
是的,有两种类型的KMP实施;使用DFA在这里介绍:https://www.youtube.com/watch?v = iZ93Unvxwtw –