KMPアルゴリズムについて

 

KMPアルゴリズム:

このアルゴリズムの性質は最初の配列(次のアレイ)を生成するために、テンプレート文字列に対して実行され、アレイは、テンプレート文字列の状況を反映しています。

例:

S:ABADACABABCD

P:BAB

我々は、アルゴリズムが暴力である場合P3およびS3(B及びD)は、等しくない照会すると、第2の文字を比較開始。

そしてKMPアルゴリズムは比較P3(から開始されるだけで引用上記の例に基づいてP3、得られた配列は、見つけるために次故障する場合、すべての位置P3、すなわち

ミスマッチは、中央値パターン文字列は右に動いている:文字の不一致位置-次の値が文字の不一致に対応します

時間の複雑さを軽減するという目的を達成するために、再び見つけるために、配列を。

 

次の配列:

  

           

{次の最大配列の長さの値との関係:次の配列に相当する「最大長」の右に全体動きは、次に初期値が割り当て-1。}

 

 この資料では、コメントを表示するには、以下のリンクをクリックした場合(非常に明確に説明)、KMPアルゴリズムの具体的な検討を理解することにあります。

オリジナルリンクします。https://blog.csdn.net/v_july_v/article/details/7041827

以下は、javaの実現の具体例であります:

 

1つの パブリック クラスKMP {
 2つの     
3      プライベート文字列TS。
4つの     プライベート列PS;
5      KMP(){
 6      }
 7      KMP(文字列TS、列PS){
 8           .TS = TS。
9          この .PS = PS。
10      }
 11      公共 ボイド敷石(文字列TS){
 12          この .TS = TS。
13      }
 14      公共 ボイドsetps(列PS){
 15          この .PS = PS。
16     }
 17      公共 int型 kmpmatch(){                     // KMP开始运算
18          INT SLEN = ts.length()。
19          INT PLEN = ps.length()。
20          INT I = 0 21          のint J = 0 22          INT []次= getNextを(PS)。
23          一方(I <SLEN && J < PLEN){
 24              であれば(J == - 1 || ts.charAt(I)== ps.charAt(J)){
 25                  I ++ 26                  J ++ ;
27              }{
 28                  J = 次の[J]。
29              }
 30          }
 31          であれば(J == PLEN){
 32              リターン I- J。
33          } {
 34              リターン -1 35          }
 36          
37      }
 38      公共 のint [] getNextを(列PS){
 39      のchar [] P = ps.toCharArray()。
40      INT []次= 新しい INT [p.length]。
41     次の[0] = - 1 ;
 42である     int型 J = 0 ;
 43である     整数 K = -1 ;
 44は     、一方(J <-p.length 1){                     // アルゴリズムの本質!
45          IF(K == - 1 || Pは[J] ==。P [K]){
 46が              K ++ ;
 47              J ++ ;
 48              IF(P [J] =!P [K]){
 49                  次に[J] = K ;
 50              } {
 51は、                  次に[J] = 次に[K];
 52である             }
 53れます          }{
 54              、K = 次の[K]。
55          }
 56      }
 57          リターン次。
58      }
 59  
60  
61  
62      公共 静的 ボイドメイン(文字列[]引数){
 63          // TODO自動生成方法スタブ
64          列A = "wdnmwdnmwdnmddnm" 65          文字列B = "wdnmwdnmd" 66          KMPのK = 新しいKMP()。
67          k.setts(A)。
68          k.setps(B)。
69         System.out.println(k.kmpmatch());         // 出力4 
70      }
 71は、 
72 }

 

おすすめ

転載: www.cnblogs.com/husai/p/12539622.html