首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KMP DFA前缀函数

KMP DFA前缀函数
EN

Stack Overflow用户
提问于 2013-11-24 08:23:03
回答 1查看 915关注 0票数 0

我被要求学习KMP DFA,我在我的书中找到的是实现,但我们的讲师一直将某些东西称为“前缀函数”。我真的不能理解这个函数的哪一部分,有人能给我解释一下吗?如果有人问我这个问题,我很抱歉,但我找不到。

代码语言:javascript
复制
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;
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2013-11-25 07:04:23

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

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

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

我希望这个解释能让前缀的功能更清晰。一些朋友调用数组,存储前缀函数fl,因为在进行匹配时,我们只在textpattern中的字符不匹配时才使用此数组中的值。

Here是该算法的一个清晰的实现(用Java语言)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20169631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档