パターン検索-ラビンカープアルゴリズム
8099 ワード
rabin‐karpは,na‐strveアルゴリズムと異なりハッシュ関数を使用するストリングにおけるパターンマッチング/探索のためのアルゴリズムである.
動作方法
私たちは、パターンの同じ長さを持つウィンドウで文字列を反復処理します. 文字列のパターンとウィンドウのハッシュ値を計算し、 パターンのハッシュ値はストリングの窓のハッシュ値に等しいです、衝突 のために2つの異なったストリングが同じハッシュ価値を持つかもしれないので、パターンでウインドウの各々の性格をチェックしてくださいパターンのハッシュ値は文字列のウィンドウのハッシュ値と等しくないので、次のウィンドウのハッシュ値をパターンのハッシュ値でチェックする.
ハッシュ関数の計算方法
ハッシュ関数は、文字列を整数値にマップするために使用されます.
有用なハッシュ関数を得るにはは、簡単に を計算されますは、事前計算を実行することができます. 任意の文字列のハッシュ関数を計算すると、一定の時間o ( 1 )
Pythonコード:
制限
スプリットヒット:
2つの異なる文字列が同じハッシュ値を持つ場合、偽のヒットが発生します.それはアルゴリズムの時間複雑度を増加させる.
スプリアスヒットの発生を減らすために,モジュラスを使用する.
時間の複雑さ
ラビン・カープの平均ケースと最良ケース複雑性は
最悪の場合の複雑さはパターンとテキストのすべての文字は、文字列のすべてのウィンドウのハッシュ値と同じです. スプリアスヒットがすべてのウィンドウに発生します.
しかし、私たちが良いハッシュ関数を使用するなら、予想される複雑さは
良いハッシュ関数が衝突を引き起こすことはめったにない.したがって、マッチがないとき、我々はめったに2つの部分文字列を比較する必要はないでしょう.
動作方法
ハッシュ関数の計算方法
ハッシュ関数は、文字列を整数値にマップするために使用されます.
有用なハッシュ関数を得るには
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.
Reference
この問題について(パターン検索-ラビンカープアルゴリズム), 我々は、より多くの情報をここで見つけました https://dev.to/hagarbarakatt/pattern-search-rabin-karp-algorithm-1jblテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol