【问题标题】:Issue in implementing knuth morris pratt algorithm实现 knuth morris pratt 算法的问题
【发布时间】:2015-11-23 17:08:43
【问题描述】:

我正在尝试实现 Knuth Morris Pratt 算法以在 Java 中进行模式搜索,但它没有给出任何结果 prefixTable 生成器代码运行良好,因为我已经检查过了,但是用于搜索的主要代码不起作用

 public void KMPAlgorithm(String T, String P){
           int pi[]= prefixFinder(P);
           int n=T.length();
           int m=P.length();
           int q=0;
           for(int i=0; i<m; i++)System.out.print(pi[i]+"  ");
           for(int i=0; i<n; i++){

               while(q>0 && P.charAt(q)!=T.charAt(i)){
                   q=pi[q-1];
               }
               if(P.charAt(q)==T.charAt(i)){
                   q++;
               }


               if(q==(m-1)){System.out.println("Pattern occurs at "+(i-(m-1)));
                 q=pi[q];
               }


           }

这里是前缀生成算法

private int[] prefixFinder(String P){
           int m=P.length();
           int pi[]= new int[m];
          pi[0]=0;
          int k=0;
          for(int i=1;i<m; i++){
              while( k>0 && P.charAt(k)!=P.charAt(i)){
                  k=pi[k];
              }
              if(P.charAt(k)==P.charAt(i)){
                  k++;

              }
              pi[i]=k;
          }


           return pi;
       }

作为输出,它没有给出任何空白,表明它没有找到任何模式 在一些边界情况下

【问题讨论】:

  • 尝试在调试器中单步执行你的代码,看看它在做什么......
  • 我试过了,当模式像这样“aba”单词在模式中重复时它不起作用它使前缀表完美但搜索不准确

标签: java algorithm knuth-morris-pratt


【解决方案1】:

您的 q 变量没有检查最后一个字母,因为当它变为 m-1 而不是 m 时,您正在更改 q。 所以这条线需要从this改为

 if(q==(m-1)){System.out.println("Pattern occurs at "+(i-(m-1)));
             q=pi[q];
           }

 if(q==(m)){System.out.println("Pattern occurs at "+(i-(m-1)));
             q=pi[q];
           }

此外,由于您的 q 现在位于末尾,您还需要更改

q=pi[q];

 q=pi[q-1];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-21
    • 2014-05-01
    • 2014-11-26
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多