私はまた、どのアルゴリズムが最悪の複雑さを持っているか知りたいと思います。 Boyer-Mooreのアルゴリズムのように線形時間の複雑さがあるようです。特定の文字列のすべての出現を見つけることが目的の場合、KMPの最悪の複雑さは何ですか?
答えて
KMPアルゴリズムは、Boyer-Mooreアルゴリズム1のように、文字列内のパターンのすべての出現を見つけるための線形複雑さがあります。あなたは「aaaaaaaaa」のような文字列で「AAAAAA」のようなパターンを発見しようとした場合、あなたが最初の完全な一致を持っていたら、
aaaaaaaaa
aaaaaa
aaaaaa
^
境界テーブルは、次の可能な最長マッチが(に対応する情報が含まれていますパターンの接頭辞の最も広い境界)は1文字だけです(完全一致は、この点でパターンの最後を過ぎた不一致に相当します)。したがって、パターンは1つの場所にさらに移動され、境界テーブルからパターンのすべての文字がおそらく最後の一致を除いて認識されるので、次の比較は最後のパターン文字と整列されたテキスト文字との間で行われる。ナイーブマッチングアルゴリズムの最悪の場合であるこの特定の場合(mの出現をnとする)、KMPアルゴリズムは各テキスト文字を正確に1回比較する。少なくとも一つ
-
テキスト文字の位置が
- テキスト
増加に対するパターンの最初の文字の位置を比較
、どちらも減少しません。比較されるテキスト文字の位置は、最大でlength(text)-1
倍に増加することができ、最初のパターン文字の位置は最大でlength(text) - length(pattern)
倍に増加することができるので、アルゴリズムは最大で2*length(text) - length(pattern) - 1
ステップを要します。
前処理(境界テーブルの構成)が最も2*length(pattern)
ステップで、このように全体的な複雑さはO(M + N)であり、m
は、パターンの長さとn
の長さであればそれ以上m + 2*n
ステップが実行されない取りテキスト
はボイヤー - ムーアアルゴリズムは一般的に提示するので、メートルおよびすべての一致が必要な場合Nような周期パターンとテキストのためのO(M×n個)の最悪の場合の複雑性を有することに留意されたい¹完全一致後、
aaaaaaaaa
aaaaaa
aaaaaa
^
<- <-
^
パターン全体が再比較されます。これを避けるには、完全一致後のシフト後にパターンの接頭辞がどれだけ長く一致し、新しい文字のみを比較するかを覚えておく必要があります。
文字列のPi関数をO(length)
に数えることができます。 KMPは、長さn+m+1
を持っている特別な文字列を構築し、その上にパイの機能をカウントし、どのような場合には複雑さがO(n+m+1)=O(n+m)
詳細をお知らせください。 –
ここで確認できます。http://www.inf.fh-flensburg.de/lang/algorithmen/pattern/kmpen.htm – kilotaras
二つの部分以来
を言って終わるhttp://en.wikipedia.org/wiki/Knuth-morris-prattでKMPで長い記事がありますされますので、アルゴリズムの複雑さはそれぞれO(k)とO(n)の複雑さを持ち、アルゴリズム全体の複雑さはO(n + k)です。
これらの複雑さは関係なく、繰り返しパターンがWまたはS (終了引用符)にあるどのように多く、同じではない
だから、KMP検索の総コストは、文字列とパターンの文字の数で直線的です。文字列にパターンが複数出現する必要があっても、これが成り立つと思います。そうでない場合は、patternQを検索することを検討してください。ここでQはテキストには現れない文字で、KMPの状態を示しますQまですべて一致していることを確認してください。
これはあまり明確ではありません。私はKMPを使って、 "aaaaa"の "aaa"の出現を見つけ出したいのですが、KMPはすべての出現を見つけるためにn * mの比較をする必要はありませんか? –
それは意味O(+ 8 3)(+ 8 3)*いくつかの定数 – kilotaras
KMPは、多くの文字がこれまでに一致したか思い出すことで比較を回避するだろう。 aaaを見て一致すると、検索する文字列の最後の3文字がaaaであることがわかります。したがって、これに続いて別のaがあるとわかると、これも新しい文字を含む最後の3文字と一致しますマッチするaaa。これはWikipediaのコードにはありません。 aaaQトリックを使用すると、KMPはaaa の不一致を認識し、aaを表す状態に進み、!= Qがaであることを確認してから、再びaaa状態に移行する必要があります。 –
mcdowella
- 1. ハッシングの複雑さ(最悪の場合)
- 2. KMP文字列検索アルゴリズムの最悪のケースは何ですか?
- 3. 最大のパリンドローム部分文字列を見つけるアルゴリズムの複雑さ
- 4. 特定の文字列を持つすべてのIDを見つける
- 5. 文字列内の特定の文字の出現箇所を見つけて表示する(シェル/ AIX)
- 6. 文字列内の文字のn番目の出現箇所を見つけて置換する方法は?
- 7. クイックソート最悪の場合の時間の複雑さ?
- 8. 正規表現は、特定の文字を見つけて、
- 9. 特定の長さの文字列を見つけるVBA
- 10. String.replaceAll()は、目的の文字列が見つからない場合、何を返しますか?
- 11. 配列の値で特定の文字が出現するのを見つけよう
- 12. 配列の文字列の出現を見つける - JQuery
- 13. 最悪の場合の複雑さを計算する方法は?
- 14. NSStringの部分文字列のすべての場所を見つける(最初だけではない)
- 15. 最大の出現数を持つ文字を見つける
- 16. 特定の文字列を見つけて削除する
- 17. ベストケースと最悪の場合、時間の複雑
- 18. pandas seriesは、最後の文字として特定の文字列を見つけます。
- 19. 他のパターン内に見つかった場合を除いて、文字列のすべての出現を見つける
- 20. 文字列内の特定の番号を見つけるか?
- 21. 指定された文字列の配列からすべての部分文字列を見つけるアルゴリズム
- 22. BeautifulSoupを使用して特定の文字列の後に来る最初の文字列を見つける
- 23. リストがn個ある場合、どの文字列のリストが似ているかを見つける最も効率的な方法は何ですか?
- 24. 特定の文字列の上のすべてにマッチする正規表現とは何ですか?
- 25. 文字列の右端の出現を見つける
- 26. 最後の文字列を検索して文字列の2番目の文字列を見つけよう
- 27. 指定されたインデックスから始まる文字列の最初の出現を見つけよう
- 28. 最悪の場合の時間の複雑度
- 29. のJava 2D配列、見つける特定の文字列
- 30. 配列の時間の複雑さから最大のJavaを見つける
しました。どうやら明らかに十分ではない。 –
私の謝罪! Upvoted。 – templatetypedef
問題はない、誤解が起こる。あなたは、クリックすると矢印を見逃したように思えます;) –