私は、KMPアルゴリズムがヘルパー配列に依存することは、接尾辞に似た接頭辞があることを理解しています。 ヘルパー配列にすべてのゼロが含まれているため、上記の条件が満たされていないと効率的ではありません。 ランタイムはO(m + n)になりますか? 私が正しいとすれば、この場合、より良い部分文字列アルゴリズムは何ですか?いつKMPアルゴリズムを使うのが良いですか?
1
A
答えて
2
KMPがいつ使用するのが良いかを理解するには、「何が代案なのですか?」という質問をするのが役に立ちます。
KMPには、最悪の場合効率が保証されているという利点があります。前処理時間は常にO(n)であり、探索時間は常にO(m)である。最悪の場合の入力はありません。不幸になる確率はありません。非常に長い文字列(大きなn)を本当に大きな文字列(大きいm)の中で検索している場合、これは他のアルゴリズム(病理学的入力にはΘ(mn)の時間がかかります)、またはBoyer-Moore(最悪の場合はΘ(mn)になることがあります。文字列の重複部分が多くない場合はKMPが必要ではないかもしれませんが、悪いケースがあるかどうか心配する必要はありません。
KMPには、処理が1回で済むという素晴らしい特性もあります。あなたが同じ部分文字列のロットとたくさんの時間を検索することを知っているなら、O(n)前処理作業を一度実行してから、長さがmの文字列を検索することができます。 (m)。
関連する問題
- 1. KMPアルゴリズムのジャンプがエラーを起こしやすいですか?
- 2. KMPアルゴリズムのプレフィックステーブル
- 3. KMPの方が良いパターンは何ですか?
- 4. KMPパターン検索アルゴリズム
- 5. Pythonを使用したKMPアルゴリズム
- 6. 複数のoccurencesのKMPアルゴリズム
- 7. KMP文字列検索のアルゴリズムですか?
- 8. BOYER-MOOREよりKMPを使用するのはいつですか
- 9. A *アルゴリズムよりBest-First-Searchアルゴリズムを使用する方が良いでしょうか?
- 10. DMP構築の過程をKMPアルゴリズムで理解する方法
- 11. KMP文字列検索アルゴリズムの最悪のケースは何ですか?
- 12. 名前を照合するための良いアルゴリズムですか?
- 13. "良い"隣人 - グラフの色付けを見つけるアルゴリズム?
- 14. KMPアルゴリズムは単純化されたBoyer-Mooreアルゴリズムと比較してパフォーマンスが低下しますか?
- 15. どちらの方法を使うのが良いですか
- 16. ロックフリーのFIFOキュー管理のアルゴリズムは良いですか?
- 17. どちらを使うのが良いですか?
- 18. 良い2Dグリッドベースのパス探索アルゴリズムとは何ですか?
- 19. いくつかのアルゴリズムがHAProxyで使用されています
- 20. アナグラムがパリンドロームかどうかを調べる最良のアルゴリズムは何ですか?
- 21. このKMPパターンマッチングアルゴリズムの実装は正しいですか?
- 22. XNAどのように良い衝突アルゴリズムを書くには?
- 23. Juliaのループでvcat()またはhcat()を使って行列を構築する方が良いアルゴリズムですか?
- 24. 多角形アルゴリズムの良い読解
- 25. krukshalのアルゴリズムまたはPrims Algorithm?最小限のスパニングツリーを見つける方が良いですか?
- 26. フラグメントを使用する方が良いでしょうか?
- 27. このパターン検出方法は、KMPまたはZアルゴリズム実装よりも優れていますか?
- 28. いくつかのAsyncTaskまたはHandlerThread(パイプラインスレッド)を使用する方が良いでしょうか?
- 29. KMPアルゴリズムアプリケーション
- 30. 教科書のハフマン符号化アルゴリズムを使用して、どのファイルの圧縮率が良いですか?
なぜこの場合:最悪の場合でも入力があり、不運になる可能性はありませんか? パターン・ストリングに繰り返しパターンがない場合、ヘルパー・アレイにはすべてゼロが含まれます。つまり、 という文字列の各文字には、パターン・ストリングの先頭に戻らなければなりませんか? – Jun
@Junフォールバック配列がすべて0になっていることは間違いありません。それぞれの不一致時に、パターン文字列の先頭に戻ってください。しかし、それが起こると、入力ストリング内で対応する距離だけ前進します。入力の各文字は最大で2回しか読み取られません。 – templatetypedef
ええ、私は今それを得る!ありがとう! – Jun