【アルゴリズム】文字マッチングアルゴリズムの詳細説明とコード実装

コンピューター サイエンスにおける文字マッチング アルゴリズムは、指定されたテキスト内の特定のパターンを見つけるための技術です。これらのアルゴリズムは、テキスト エディター、検索エンジン、ネットワーク セキュリティ、バイオインフォマティクスなど、さまざまなアプリケーションで重要な役割を果たします。この記事では、一般的に使用される 2 つの文字マッチング アルゴリズム、naive メソッドと KMP アルゴリズムを詳しく紹介します。これらのアルゴリズムをより深く理解するために、Python コードの実装も提供します。

1. 簡単な方法

単純な方法は、メイン文字列とパターン文字列の要素を 1 つずつ比較するという単純な文字マッチング アルゴリズムです。このアルゴリズムの時間計算量は O(mn) です。ここで、m と n はそれぞれメイン文字列とパターン文字列の長さです。

アルゴリズムの手順は次のとおりです。

(1) メイン文字列の先頭文字とパターン文字列の先頭文字の比較を開始します。

(2) それらが等しい場合は、パターン文字列内のすべての文字がメイン文字列内の対応する文字と等しくなるまで、次の文字の比較を続けます。

(3) 比較の結果、等しくない場合は、メイン文字列の次の文字から開始して、パターン文字列の最初の文字と再度比較します。

(4) 一致するものが見つかるか、メイン文字列全体が走査されるまで、ステップ (2) と (3) を繰り返します。

以下は Python コードの実装です。

def naive_search(text, pattern):
    m = len(text)
    n = len(pattern)

    for i in range(m - n + 1):
        j = 0
        while j < n and text[i + j] == pattern[j]:
            j += 1
        if j == n:
            return i
    return -1

2. KMPアルゴリズム

KMP アルゴリズムは改良された文字照合アルゴリズムで、パターン文字列内で照合失敗の位置を検出し、一致した情報を使用して不必要な比較をスキップすることで効率を向上させます。このアルゴリズムの時間計算量は O(m + n) です。ここで、m と n はそれぞれメイン文字列とパターン文字列の長さです。

アルゴリズムの手順は次のとおりです。

(1) パターン文字列を前処理し、次の配列を構築します。next[i]は、パターン文字列のi番目の文字がメイン文字列の文字と一致しない場合に、パターン文字列を右に移動する距離を示します。次の配列を構築する方法は、位置 i ごとに、その前に出現した同じプレフィックスとサフィックスの長さを計算することです。

(2) メイン文字列の先頭文字とパターン文字列の先頭文字の比較を開始します。

(3) 等しい場合は次の文字の比較を続け、パターン文字列の次の文字を主文字列のどの文字と比較するかを次の配列に従って更新します。

(4) 比較の結果、等しくない場合は、次の配列に従ってパターン文字列の位置を更新し、次の文字の比較を続けます。

(5) 一致するものが見つかるか、メイン文字列全体が走査されるまで、ステップ (3) と (4) を繰り返します。

以下は Python コードの実装です。

def compute_prefix_function(pattern):
    n = len(pattern)
    next = [0] * n
    j = 0
    for i in range(1, n):
        while j > 0 and pattern[j] != pattern[i]:
            j = next[j - 1]
        if pattern[j] == pattern[i]:
            j += 1
        next[i] = j
    return next

def kmp_search(text, pattern):
    m = len(text)
    n = len(pattern)
    next = compute_prefix_function(pattern)
    i = 0
    j = 0
    while i < m and j < n:
        if text[i] == pattern[j]:
            i += 1
            j += 1
        else:
            j = next[j - 1] + 1 if j > 0 else 0
    if j == n:
        return i - j + 1
    return -1

おすすめ

転載: blog.csdn.net/qq_22744093/article/details/132461493