情報生命科学特別講義III (3)たたみ込みとハッシュに 基づくマッチング 阿久津 達也 京都大学 化学研究所 バイオインフォマティクスセンター
講義予定 第1回: 文字列マッチング 第2回: 文字列データ構造 第3回: たたみ込みとハッシュに基づくマッチング 第1回: 文字列マッチング 第2回: 文字列データ構造 第3回: たたみ込みとハッシュに基づくマッチング 第4回: 近似文字列マッチング 第5回: 配列アラインメント 第6回: 配列解析 第7回: 進化系統樹推定 第8回: 木構造の比較:順序木 第9回: 木構造の比較:無順序木 第10回: 文法圧縮 第11回: RNA二次構造予測 第12回: タンパク質立体構造の予測と比較 第13回: 固定パラメータアルゴリズムと部分k木 第14回: グラフの比較と列挙 第15回: まとめ
たたみ込みによる 文字列マッチング
たたみ込みとFFT ベクトル a=(a0,…,am-1) と b=(b0,…,bn-1) のたたみ込み a*b は を要素とするベクトル c=(c0,…,cn+m-1) (ただし、cn+m-1=0と定義) 2つの多項式 の積 の各係数は、たたみ込みベクトルの各成分に等しい (a0,…,am-1) と (b0,…,bn-1) のたたみ込みはFFTを用いて (Real-RAM上で) O(n log n) 時間で計算可能(ただし、m≦n)
たたみ込みによる文字列マッチング: アイデア (a0, a1,a2) と (b0,…,bn-1) のたたみ込みを考える ここで、 a0, a1,a2 を逆順にすれば、以下のようになる ⇒ パターンを逆順にして、たたみ込みを行えば、 文字列マッチングに使えそう (Fisher-Patersonアルゴリズム)
たたみ込みによる文字列マッチング Σ={a,b}, T = abbabbab, P=abb, P-1=bba として、 χa(T)などを次のように定義 すると この2個のベクトルの和は 0131131120 となり、 値が 3 となる桁がマッチしている場所に対応 定理:文字列マッチングは FFT により O(n log m) 時間で実行可能 (ただし、|Σ|は定数)
Don’t Care記号つき文字列マッチング KMP, BM, ACアルゴリズムを Don’t Care記号つきに拡張するのは困難。でも、たたみ込み法なら、以下の例のように簡単 χa*(...) は、対象の文字が a か * なら、1 に対応させる 定理:Don’t Care記号つき文字列マッチングは FFT により O(n log m) 時間で実行可能 (ただし、|Σ|は定数)
Karp-Rabinアルゴリズム
ランダマイズド・アルゴリズム(乱拓アルゴリズム) 同じ入力を与えても、アルゴリズムの動作が内部で用いた乱数の値により異なるアルゴリズム ラスベガス・アルゴリズム 常に正しい解を出力(ただし、計算時間は乱数により異なることがある) モンテカルロ・アルゴリズム 誤った解を出力する可能性がある
Karp-Rabinアルゴリズム: アイデア ハッシュ関数の利用 長さ m の各部分文字列に対し、以下の性質を満たす 整数値(ハッシュ値) を計算
Karp-Rabinアルゴリズム: ハッシュ関数 q を適当に大きな素数とし、b を適当な基数(例: b=2)とすると なお、h()は、毎回計算しなおさなくても、 により、1回あたり O(1) 時間で計算可能 定理: q を適当な範囲内でランダムに選ぶことにより、どのような 入力 P, T に対しても、高い確率で以下が成立 Karp-Rabinアルゴリズム ハッシュ関数を計算し、一致している場所を出力 ⇒ 線形時間モンテカルロ・アルゴリズム
Karp-Rabinアルゴリズム: 確率の解析 補題: 任意の N について、(異なる)素因数の個数は O(log N) (証明) 素数は2以上なので、t 個の素因数を持てば N≧2t 補題: x,y (x≠y) をそれぞれ m ビットの数とする。τ 以下の素数 p をランダムに選んだ時、(x = y) mod p となる確率は (証明) (x = y) mod p となるのは |x-y| が p の倍数の時のみ。 一方、|x-y| の素因数の個数は上記補題より O(m) 個。 τ 以下の素数の個数は素数定理より≈ τ/ln τ なので、 (x = y) mod p となる確率は 。 (Karp-Rabinの定理の証明) τ = n2m log n2m とすれば、 なのに、ハッシュ値が一致してしまう i の存在確率は
ラスベガス・アルゴリズム化 方法1 マッチが見つかったら O(m) 時間かけてチェック 誤りであれば、単純なO(mn)時間アルゴリズムを 最初から実行 計算時間の期待値は O((m+n)+(1/n)(mn))=O(m+n) 方法2 マッチが見つかったら O(m) 時間かけてチェック 誤りであれば、異なる素数 p を用いて再実行 計算時間の期待値は O(m+n) 注意: 素数生成のための時間は考慮していないが、考慮しても定理や解析は成立
まとめ たたみ込みによる文字列マッチング Karp-Rabinアルゴリズム 補足 Don’t care 文字が扱える。 O(n log m) 時間 Karp-Rabinアルゴリズム ハッシュ関数を用いたランダマイズド・アルゴリズム 補足 たたみ込みマッチングは、文字のミスマッチにも対応可 たたみ込みを用いずに don’t care つき文字列マッチングを効率的に扱うのは(たぶん)研究課題 Karp-Rabinアルゴリズムは広くは利用されていないが、文字列などのデータをハッシュするという考え方は、第4回に説明する Locality Sensitive Hashingや埋め込み(Embedding)などの名で盛んに研究・応用されている 本講義で研究課題としたものはすべて「たぶん」です