Мне было предложено узнать о KMP DFA, и то, что я нашел в своей книге, - это реализация, но наш лектор все время называет что-то «префиксной функцией». Я действительно не могу понять, какая часть этой функции здесь, может кто-нибудь объяснить это мне? Извините, если это было спрошено где-то, но я не мог найти его.KMP DFA prefix function
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 существует 2 типа реализации; здесь используется DFA: https://www.youtube.com/watch?v=iZ93Unvxwtw –