パターン マッチングは、コンピューター サイエンスや他の多くの分野で広く使用されています。パターン マッチング アルゴリズムは、より大きなテキストまたはデータ セット内のパターンを検索するために使用されます。パターン マッチングの最も一般的なアルゴリズムの 1 つは、 ボイヤー・ムーア この記事では、C のパターン マッチング アルゴリズムとその仕組みについて説明します。
パターンマッチングアルゴリズムとは何ですか?
パターン マッチング アルゴリズムは、より大きなデータまたはテキストのセット内でパターンを見つけるために使用されます。これらのアルゴリズムは、パターンをより大きなデータセットまたはテキストと比較し、パターンが存在するかどうかを判断することによって機能します。パターン マッチング アルゴリズムは、大規模なデータ セット内のパターンを迅速に検索できるため重要です。
メイブンとは何ですか
ブルートフォースパターンマッチングアルゴリズム:
ブルート フォース パターン マッチングは、最も単純なパターン マッチング アルゴリズムです。パターンの文字とテキストの文字を 1 つずつ比較する必要があります。すべての文字が一致する場合、アルゴリズムはテキスト内のパターンの開始位置を返します。そうでない場合、アルゴリズムはテキスト内の次の位置に移動し、一致が見つかるかテキストの終わりに達するまで比較を繰り返します。ブルート フォース アルゴリズムの時間計算量は次のとおりです。 O(MXN) 、 どこ M はテキストの長さを表し、 N はパターンの長さを表します。
単純なパターン マッチング アルゴリズム:
Naive Pattern Matching アルゴリズムは、Brute Force アルゴリズムを改良したものです。テキスト内のいくつかの位置をスキップすることで、不必要な比較を回避します。アルゴリズムは、パターンとテキストの最初の位置の比較を開始します。文字が一致する場合は、次の位置に移動して比較を繰り返します。文字が一致しない場合、アルゴリズムはテキスト内の次の位置に移動し、パターンとテキストを再度比較します。 Naive アルゴリズムの時間計算量も O(MXN) , ただし、ほとんどの場合、ブルート フォース アルゴリズムよりも高速です。
クヌース・モリス・プラットアルゴリズム:
の クヌース・モリス・プラット (KMP) アルゴリズムは、より高度なパターン マッチング アルゴリズムです。これは、不一致が発生した場合に、テキストとパターンに関する情報を使用して不必要な比較を回避できるという観察に基づいています。このアルゴリズムは、パターンに関する情報を含むテーブルを事前計算します。このテーブルは、不一致が発生した場合にパターンの何文字をスキップできるかを決定します。の時間計算量 KMP アルゴリズムは O(M+N) 。
ボイヤー・ムーアアルゴリズム:
最も人気のあるパターン マッチング アルゴリズムの 1 つは、 ボイヤー・ムーア アルゴリズム。このアルゴリズムは、1977 年に Robert S. Boyer と J Strother Moore によって初めて公開されました。の ボイヤー・ムーア このアルゴリズムは、他のほとんどのパターン マッチング アルゴリズムと同様に、パターンを左から右ではなく右から左へ、より大きなデータまたはテキストのセットと比較します。
の ボイヤー・ムーア このアルゴリズムには、不良文字ルールと良好なサフィックス ルールという 2 つの主要なコンポーネントがあります。不良文字ルールは、パターン内の文字をデータまたはテキスト内の対応する文字と比較することによって機能します。文字が一致しない場合、アルゴリズムは一致する文字が見つかるまでパターンを右に移動します。適切な接尾辞ルールは、パターンの接尾辞をデータまたはテキストの対応する接尾辞と比較します。サフィックスが一致しない場合、アルゴリズムは一致するサフィックスが見つかるまでパターンを右に移動します。
の ボイヤー・ムーア アルゴリズムはその効率性で知られており、多くのアプリケーションで広く使用されています。これは、利用可能な最も高速なパターン マッチング アルゴリズムの 1 つと考えられています。
C での Boyer-Moore アルゴリズムの実装:
実装するには、 ボイヤー・ムーア C のアルゴリズムでは、不正な文字ルールを定義することから始めることができます。配列を使用して、パターン内の各文字の最後の出現を保存できます。この配列は、不一致が発生した場合にパターンをどれだけ右に移動する必要があるかを決定できます。
以下は、C で不正な文字ルールを実装する方法の例です。
分配法則ブール代数
C コード:
void bad_character_rule(char *pattern, int pattern_length, int *bad_char) { int i; for (i = 0; i <no_of_chars; i++) bad_char[i]="-1;" for (i="0;" i < pattern_length; bad_char[(int) pattern[i]]="i;" } pre> <p>In this example, we first initialize the array to -1 for all characters. We then iterate through the pattern and update the array with the last occurrence of each character in the pattern.</p> <p>Next, we can implement the good suffix rule. We can use an array to store the length of the longest suffix of the pattern that matches a suffix of the data or text. This array can be used to determine how far we need to move the pattern to the right.</p> <hr></no_of_chars;>