パターン検索-ラビンカープアルゴリズム


rabin‐karpは,na‐strveアルゴリズムと異なりハッシュ関数を使用するストリングにおけるパターンマッチング/探索のためのアルゴリズムである.

動作方法
  • 私たちは、パターンの同じ長さを持つウィンドウで文字列を反復処理します.
  • 文字列のパターンとウィンドウのハッシュ値を計算し、
  • パターンのハッシュ値はストリングの窓のハッシュ値に等しいです、衝突
  • のために2つの異なったストリングが同じハッシュ価値を持つかもしれないので、パターンでウインドウの各々の性格をチェックしてください
  • パターンのハッシュ値は文字列のウィンドウのハッシュ値と等しくないので、次のウィンドウのハッシュ値をパターンのハッシュ値でチェックする.



  • ハッシュ関数の計算方法
    ハッシュ関数は、文字列を整数値にマップするために使用されます.
    有用なハッシュ関数を得るには
  • は、簡単に
  • を計算されます
  • は、事前計算を実行することができます.
  • 任意の文字列のハッシュ関数を計算すると、一定の時間o ( 1 )

  • Pythonコード:
    # q is a prime number -modulus-
    def rabin_karp(string, pattern, q):
        d = 256
        n = len(string)
        m = len(pattern)
        s = 0
        p = 0
        h = 1
        i = 0
        j = 0
        for _ in range(m - 1):
            h = (h*d) % q
        for i in range(m):
            p = (d*p + ord(pattern[i])) % q
            s = (d*s + ord(string[i])) % q
        for i in range(n - m + 1):
            if p == s:
                for j in range(m):
                    if string[i+j] != pattern[j]:
                        break
                j += 1
                if j == m:
                    print("pattern found at index:", i)
            if i < n-m:
                s = (d * (s - ord(string[i])*h) + ord(string[i + m])) % q
            if s < 0:
                s = s + q
    
    
    string = "ABCDAF"
    pattern = "DAF"
    q = 113
    rabin_karp(string, pattern, q)
    

    制限

    スプリットヒット:
    2つの異なる文字列が同じハッシュ値を持つ場合、偽のヒットが発生します.それはアルゴリズムの時間複雑度を増加させる.
    スプリアスヒットの発生を減らすために,モジュラスを使用する.

    時間の複雑さ
    ラビン・カープの平均ケースと最良ケース複雑性はO(m + n)である
    最悪の場合の複雑さはO(nm)です.
  • パターンとテキストのすべての文字は、文字列のすべてのウィンドウのハッシュ値と同じです.
  • スプリアスヒットがすべてのウィンドウに発生します.
  • しかし、私たちが良いハッシュ関数を使用するなら、予想される複雑さはO(n + k . t)であるでしょう.
    良いハッシュ関数が衝突を引き起こすことはめったにない.したがって、マッチがないとき、我々はめったに2つの部分文字列を比較する必要はないでしょう.

    If we only want to check the existence of the pattern, the complexity would be O(n+k), as we can break the loop after the first occurrence.