【ラビンカープほう】

ラビン・カープ法 とは?

公開:
💡 文字列の指紋を転がしながら、一致候補を探す

文字列の各区間をハッシュ値で絞り込む検索法。区間を1文字ずらしたハッシュを効率よく計算し、一致候補だけを詳しく調べる。

📌 このページのポイント
窓をずらし、ハッシュで候補を選ぶ 本文 ABCA / 検索 BC(ハッシュ10) AB ハッシュ 12 BC ハッシュ 10 CA ハッシュ 5 BC は値が一致 → 実際の文字を確認 A=1, B=2, C=3 / (10×前+後) mod 13 衝突の例:AA と BD は、ともに11
図のハッシュは説明用の小さな値。衝突するため、厳密な検索では文字も照合する。
ひよこ ひよこ
文章をハッシュで探せるの?
ペンギン先生 ペンギン先生
探すパターンと、本文の同じ長さの区間にハッシュ値を付けて比べるよ。異なる値なら、その区間は一致しないと分かる。同じ値なら候補なので、厳密に探す実装では実際の文字列も比較するんだ。
ひよこ ひよこ
毎回ハッシュを作るのは大変そう。
ペンギン先生 ペンギン先生
そこでローリングハッシュを使うよ。窓を1文字ずらすとき、出ていく文字の寄与を引き、残った部分をずらし、入ってくる文字を足す。毎回、窓の全体を最初から読み直して計算しなくてよいんだ。
ひよこ ひよこ
小さな数で例を見せて!
ペンギン先生 ペンギン先生
Aを1、Bを2、Cを3とし、2文字xyの値を「10×x+yを13で割った余り」としよう。ABは12、BCは10、CAは5になる。本文ABCAでBCを探すなら、窓の値12→10→5のうち、10の位置で文字を確認するんだ。図は仕組みを見せるための小さな数だよ。
ひよこ ひよこ
同じハッシュなら、確認を省いてもいい?
ペンギン先生 ペンギン先生
違う文字列が同じ値になる衝突があるよ。この例でもAAとBDはどちらも11だけど、文字列は違う。確認を省く方式には誤検出の可能性が残るし、複数のハッシュを使っても数学的に同一とは限らないんだ。
もっと詳しく知りたい人へ

検索は必ずO(n+m)ですか?

本文長n、パターン長mとすると、固定幅のハッシュ計算を定数時間とみなす条件でハッシュの走査自体はO(n+m)です。候補の文字照合を行う方式では、衝突や一致候補が多いと照合のコストが増え、単純な実装の最悪時間はO(nm)になり得ます。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ラビン・カープ法」って出てきたら「更新しやすいハッシュで、文字列の一致候補を絞る検索」と思えればだいたいOK!

参考資料

← 用語集にもどる