0

我被要求了解 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;
        }
    }
}
4

1 回答 1

1

KMP 算法不构造 DFA。您实现的看起来更像是一个 DFA,它可以识别一些 string pattern

KMP 算法背后的思想是为给定的 构造所谓的前缀函数pattern。这个功能是什么?它的定义是,对于i字符串的每个位置,我们感兴趣的是 的最长后缀的长度pattern[1..i],它也是pattern字符串的前缀(0-indexed)。这可能听起来令人困惑,但这里有一个例子:

的前缀函数pattern = "abacabacada"pf[] = 0 0 1 0 1 2 3 4 5 0 1pf[8]等于5,因为“bacabaca”的最长后缀,也就是“abacabacada”的前缀是“abaca”,它的长度是5。类比,pf[9] = 0因为没有后缀bacabacad也是abacabacada(模式的前缀) )。

我希望这个解释使前缀功能更加清晰。有的朋友叫数组,存放前缀函数,是“fail link”的缩写,因为我们在做匹配的时候,只有当来自和不匹配fl的字符时才使用这个数组中的值。textpattern

是算法的清晰实现(在Java中)。

于 2013-11-24T23:04:22.503 回答