基于DFA的KMP实现是否比标准实现更有效?

这种基于确定性有限状态自动机的KMP算法的复杂性是多少?它是否比标准的非自动机版KMP算法更有效?
class KMP {
  private final int R;      
  private int[][] dfa;      

  private String pat;       

  public KMP(String pat) {
    this.R = 256;
    this.pat = pat;

    int M = pat.length();
    dfa = new int[R][M]; 
    dfa[pat.charAt(0)][0] = 1; 
    for (int X = 0, j = 1; j < M; j++) {
        for (int c = 0; c < R; c++) 
            dfa[c][j] = dfa[c][X];     
        dfa[pat.charAt(j)][j] = j+1;   
        X = dfa[pat.charAt(j)][X];     
    } 
  } 

  public int search(String txt) {
    int M = pat.length();
    int N = txt.length();
    int i, j;
    for (i = 0, j = 0; i < N && j < M; i++) {
        j = dfa[txt.charAt(i)][j];
    }
    if (j == M) return i - M;    
    return -1;                   
  }
}
测试:
// test KMP DFA
KMP p = new KMP("abacab");
System.out.println("KMPDfa: " + p.search("ababbadabacabcbabac"));
output: 7
    
已邀请:
我相信KMP的标准版本更有效率,因为它使用的内存比DFA版本少。如果您有大字母和大图案,DFA阵列可能会变得非常大。 两个版本的实现可以在流动的链接中找到,并且在相关的课程页面中有很好的文档说明(注意在给定的链接中KMPplus是标准版本)。 http://algs4.cs.princeton.edu/53substring/KMP.java.html http://algs4.cs.princeton.edu/53substring/KMPplus.java.html     

要回复问题请先登录注册