簡體   English   中英

實現knuth morris pratt算法的問題

[英]Issue in implementing knuth morris pratt algorithm

我正在嘗試實現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;
       }

作為輸出,它沒有給出空白,表明在某些邊界情況下沒有找到任何模式

您的q變量沒有檢查最后一個字母,因為您在更改q時將其變為m-1而不是m。 因此,此行需要從此更改為

 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];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM