我被要求瞭解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 –