情報生命科学特別講義 iii ( 2 )文字列データ構造

34
情情情情情情情情情情 III 2 情情情情情情情情 阿阿阿 阿阿 阿阿阿阿 阿阿阿阿阿 阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿

Upload: kishi

Post on 22-Jan-2016

50 views

Category:

Documents


0 download

DESCRIPTION

情報生命科学特別講義 III ( 2 )文字列データ構造. 阿久津 達也 京都大学 化学研究所 バイオインフォマティクスセンター. 講義予定. 第1回 : 文字列マッチング 第2回:  文字列データ構造 第3回:  たたみ込みとハッシュに基づくマッチング 第4回:  近似文字列マッチング 第5回 :  配列アラインメント 第6回:  配列解析 第7回 :  進化系統樹推定 第8回 :  木構造の比較:順序木 第9回 :  木構造の比較:無順序木 第10回 :  文法圧縮 第11回 : RNA 二次構造予測 第12回 :  タンパク質立体構造の予測と比較 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 情報生命科学特別講義 III ( 2 )文字列データ構造

情報生命科学特別講義 III

( 2 )文字列データ構造

阿久津 達也

京都大学 化学研究所バイオインフォマティクスセンター

Page 2: 情報生命科学特別講義 III ( 2 )文字列データ構造

講義予定 第1回 :  文字列マッチング 第2回: 文字列データ構造 第3回: たたみ込みとハッシュに基づくマッチング 第4回: 近似文字列マッチング 第5回: 配列アラインメント 第6回: 配列解析 第7回: 進化系統樹推定 第8回: 木構造の比較:順序木 第9回: 木構造の比較:無順序木 第10回: 文法圧縮 第11回:  RNA 二次構造予測 第12回: タンパク質立体構造の予測と比較 第13回: 固定パラメータアルゴリズムと部分 k 木 第14回: グラフの比較と列挙 第15回: まとめ

Page 3: 情報生命科学特別講義 III ( 2 )文字列データ構造

接尾辞木

Page 4: 情報生命科学特別講義 III ( 2 )文字列データ構造

接尾辞木 (suffix tree)文字列 S[1..n] の接尾辞 (suffix)S[1..n], S[2..n], S[3..n], ・・・ , S[n-1..n], S[n..n]

接尾辞木 文字列のすべての 接尾辞から構成されるトライ( trie )

S[n+1]=$ を追加し最後尾を表す (以降は $ を追加後に n 文字とする)ただし、子が 1 個しか

ない頂点は縮約

S=aabbccdabbca$ の接尾辞$a$ca$bca$...

abbccdabbca$aabbccdabbca$

Page 5: 情報生命科学特別講義 III ( 2 )文字列データ構造

接尾辞木の応用: パターン検索 テキスト文字列の接尾辞木を構成(1回のみ) パターン文字列の入力の毎に、根から一致する文字を順にたどる パターン文字列長に比例する時間( O(m) 時間)で検索が終了

テキスト文字列長に無関係 ⇒ データベース検索に有用

Page 6: 情報生命科学特別講義 III ( 2 )文字列データ構造

接尾辞木の応用: Longest Common Substring 2個の文字列 S1, S2 に共通に出現する最長の連続部分文字列の検出

「 k 文字ずらしては一致する部分をチェックする」というアルゴリズムでは O(|S1| ・ |S2|) 時間

接尾辞木を用いれば 線形時間(なお、接尾辞木も線形時間で構築可能) S=S1#S2$ の接尾辞木 を作成 ⇒ # を含む葉へのパスと含まない葉へのパスを

持つ頂点をマーク ⇒ 根からの文字数最大のマークつき頂点を探す

S1=aabbccS2=abbdd

S=aabbcc#abbdd$

Page 7: 情報生命科学特別講義 III ( 2 )文字列データ構造

接尾辞木の構成:単純な方法 接尾辞木の葉の数は n 個 ⇒ 接尾辞木の頂点数、枝数は O(n) 枝の文字列は S 中の位置で記憶 ⇒ 接尾辞木は O(n) 領域

接尾辞木の構築法 (単純な方法)i が 1 から n まで S[i…n] を 1 個ずつ追加しながらトライを作成子が1個しかない頂点を縮約時間計算量 1 個の追加に O(n) 時間  ⇒全部の追加に O(n2) 時間縮約も O(n2) 時間⇒  全体で O(n2) 時間

Page 8: 情報生命科学特別講義 III ( 2 )文字列データ構造

Ukkonen アルゴリズム

[Ukkonen: Algorithmica 1995]

Page 9: 情報生命科学特別講義 III ( 2 )文字列データ構造

Ukkonen アルゴリズム:アイデア オンライン・アルゴリズム

S の最初の文字から始め、1文字ずつ文字を読み込む i 文字目を読み込む度に、 S[1..i] の接尾辞木に更新

接尾辞木の簡潔な表現 そのまま接尾辞木を保持すると更新のたびに多くの時間が必要 ⇒ $ のみからなる枝は持たない

接尾辞リンクの活用(後で説明) ⇒ 線形時間アルゴリズム

Page 10: 情報生命科学特別講義 III ( 2 )文字列データ構造

Ukkonen アルゴリズム:基本版S[1] に対応する接尾辞木 T1 を構成 ;

for i←1 to n-1 do

for j←1 to i+1 doS[j..i] に一致する根からのパスをたどる ;

次の位置に文字 S[i+1] がなければ枝を追加 ;

( 更新後の接尾辞木を Ti+1 とする)

S[i] の次が葉の場合は、枝を追加しない(葉は最後の文字に対応するので、枝につく文字が増えても何もしなくて良い)

1 回の S[j..i] のチェックに O(n) 時間、全部で O(n2) 回のチェック ⇒ O(n3) 時間

Page 11: 情報生命科学特別講義 III ( 2 )文字列データ構造

Ukkonen アルゴリズム:文字追加の規則S[i+1] の追加の規則規則 1: S[j…i] に対応する根からのパスが葉で終われば、その枝のラベルの最後に S[i+1] を追加 (ただし、実際は何もしない)規則 2: S[i+1] に対応する葉も枝もなければ、 S[i+1] をラベルにもつ新たな枝と、新たな内部頂点を追加規則 3: S[i+1] に対応する枝があれば、何もしない

規則 1規則 1

規則 2 規則 3

Page 12: 情報生命科学特別講義 III ( 2 )文字列データ構造

Ukkonen アルゴリズム:規則の性質補題 : 規則 3 が一度適用されたら、 j’>j において S[j’..i] は調べる必要はない ( S[j’..i] への S[i+1] の追加は葉の伸長により自動的に対応)

証明 : S[j’..i+1] は S[j..i+1] の接尾辞なので、 S[j..i+1] に対応する根からのパスがあれば、 S[j’..i+1] に対応するパスも存在

補題 : S[j..i] のパスをたどって S[i+1] に対応する枝が新たに追加されたらば、 i’>i において S[j..i’] を調べる必要はない証明 : 追加された枝の最後のラベルは常に S[i’+1] に対応

上記補題から、 S[j..i+1] のチェックは以下のように行えば十分i: S[ji+1..i+1], S[ji+2..i+1], …, S[ji+1+1..i+1]

i+1: S[ji+1+1..i+2], S[ji+1+2..i+2], …, S[ji+2+1..i+2]

i+2: S[ji+2+1..i+3], S[ji+2+2..i+3], …, S[ji+3+1..i+3]

i+3: S[ji+3+1..i+4], S[ji+3+2..i+4], …, S[ji+4+1..i+4]

⇒ 規則 3 が適用されたらステップ i において、それ以降の j をチェックしない

⇒ 規則 2 が適用されたら、以降のすべてのステップにおいて、その jをチェックしない 

Page 13: 情報生命科学特別講義 III ( 2 )文字列データ構造

Ukkonen アルゴリズム:改良版1 回の S[j..i] のチェックにO(n) 時間、全部で O(n) 回のチェック

⇒ O(n2) 時間

規則 3 規則 3

規則 3規則 2

規則 2

規則 2

葉がすべて先に延長されているので、規則1の適用はない

空の接尾辞木 T1 を構成 ; j1←0;

for i←1 to n-1 do

すべての葉を延長 ;

for j←ji+1 to i+1 do

S[j..i] に一致する根からのパスをたどる ;

if 次の位置に文字 S[i+1] がある(規則 3 ) then   ji+1←j-1; break;

規則 2 を適用 ; ji+1←j

規則 2

Page 14: 情報生命科学特別講義 III ( 2 )文字列データ構造

Ukkonen アルゴリズム:接尾辞リンク接尾辞リンク : x を文字、 α を文字列とする。 v をパスラベルが xα

である内部頂点とする。パスラベルが α である内部頂点を w とする時、 v の接尾辞リンク s(v) は s(v)=w ( α が空の時、 s(v) は根)

補題 : v を接尾辞木の内部頂点とすると、 s(v) は必ず存在証明 : v が内部頂点なので、 xαyβ と xαzγ という接尾辞があるはず( y≠z )。よって、 αy 、 αz というパスラベルも存在し、 α をパスラベルとする内部頂点が存在。

パスラベル: 根から頂点までのパスの枝のラベルを連結した文字列接尾辞リンクは葉にも定義可能

Page 15: 情報生命科学特別講義 III ( 2 )文字列データ構造

Ukkonen アルゴリズム:接尾辞リンクの利用接尾辞リンクをたどると 、 S[j..i] を根から毎回たどらなくても、木の更新ができる。

枝を追加して新たな内部頂点ができる度に、接尾辞リンクを新たに追加。

例(下図) : Ti の構築が終了した時点で、ピンクの d を参照。(ピン クの d は S[ji+1..i] に対応。実際には、直前の頂点を記憶( d の位置は ji

から計算可能))Ti+1 の構築のために、 cada, ada, da, a を追加する(他は葉をのばせばよい)。接尾辞リンクをたどりながら、 d で終わる文字を見つけ、その下に頂点を挿入。

最後の a (ピンクの a )は規則 3 により追加の必要がない。 この a が次の S[ji+1+1..i+1] に対応。

Ti Ti+1

Page 16: 情報生命科学特別講義 III ( 2 )文字列データ構造

Ukkonen アルゴリズム:接尾辞リンクの利用根まで至らずに接尾辞リンクをたどるのが終わる場合(規則3が適用)の例

S=bdbeabdabcabe

(葉の伸長部分は省略)

Page 17: 情報生命科学特別講義 III ( 2 )文字列データ構造

Ukkonen アルゴリズム:枝の経由法前の図では、各内部頂点から1文字たどるだけで目的の位置にたどりつけたが、場合によっては何文字もたどることが必要。しかし、枝を 1本たどるのは定数時間で可能(最初の文字だけ見てどの枝を選べばよいかわかれば、接尾辞の性質により他の文字は一致)。

もちろん、場合によっては複数の枝を経由することも必要であるが、計算量のならし解析により、全部で O(n) 回の経由で済むことを示すことができる(詳細は省略)。

Page 18: 情報生命科学特別講義 III ( 2 )文字列データ構造

Ukkonen アルゴリズム: $ の追加

定理: 接尾辞木は線形時間で構成可能

最後に $ を追加し、接尾辞木を完成させる。 $ の追加は(これまでに出現していない)新たな文字

を最後尾に追加するのと全く同じ。

Page 19: 情報生命科学特別講義 III ( 2 )文字列データ構造

Burrows-Wheeler変換

参照 : [岡野原: 情報処理 , 2012]

Page 20: 情報生命科学特別講義 III ( 2 )文字列データ構造

Burrows-Wheeler ( BW )変換例で示す:  S=abracadabra$ ( $ は終端を意味)

この文字列を巡回させた文字列をすべて生成し、ソートし、終端の文字を並べたものが変換後の文字列

ard$rcaaaabb

ソート

Page 21: 情報生命科学特別講義 III ( 2 )文字列データ構造

BW変換: 逆変換変換後の文字列同じ文字が連続して並ぶことが多い ⇒ データ圧縮に有利 もとの文字が(同じ回数だけ)出現

終端 始端逆変換:アイデアソート後の巡回文字列の終端( BW変換)と始端の文字を並べる(文字には順番に番号を付加)同じ行の(終端、始端)は S 中で連続して出現

逆変換:方法始端を並べた文字列を、 BW変換後の文字をソートして作成左側が $ である行を探す⇒右側( a3 )が S の 1番目左側が a3 である行を探す⇒右側( b2 )が S の 2番目左側が b2 である行を探す⇒右側( r2 )が S の 3番目この作業を繰り返す

S=abracadabra$

Page 22: 情報生命科学特別講義 III ( 2 )文字列データ構造

始端と終端で順番が保存される理由

これをソートしたものの末尾が a になるので、始端と終端で a の順番が保存される

終端 始端

Page 23: 情報生命科学特別講義 III ( 2 )文字列データ構造

BW変換: 部分文字列検索以下の関数(高速に計算可能)を利用C(x): ソート後の表における、文字 x を先頭とする最初の接尾辞の位置rankx(B,i): B[1…i-1] 中に出現する文字 x の個数

S=abracadabra$

),(

;none''

);,(])[(

);,(])[(

1

;1;1

][

][

epsp

epsp

epBrankipCep

spBrankipCsp

mi

nepsp

ip

ip

return

returnthenif

dotofor

C(a)=2, C(b)=7, C(c)=9, C(d)=10, C(r)=11

B 接尾辞 検索アルゴリズム

P=bra の場合の (s,p) の変化(1,13) ⇒ a ⇒ (2,7) ⇒ r ⇒ (11,13)⇒ b⇒ (7,9)P=braa の場合の (s,p) の変化(1,13) ⇒ a ⇒ (2,7) ⇒ a ⇒ (3,3) ⇒ none

行 i において、 B [i] は接尾辞の1個前の文字

Page 24: 情報生命科学特別講義 III ( 2 )文字列データ構造

),(

;none''

);,(])[(

);,(])[(

1

;1;1

][

][

epsp

epsp

epBrankipCep

spBrankipCsp

mi

nepsp

ip

ip

return

returnthenif

dotofor

BW変換: 部分文字列検索の例 S=abracadabra$

C(a)=2

C(b)=7

C(c)=9

C(d)=10

C(r)=11

P=bra の時の (sp,ep) の変化 sp ep (1,13) ⇒ C(a)+ranka(B,1)=2+0=2 C(a)+ranka(B,13)=2+5=7 (2,7) ⇒ C(r)+rankr(B,2)=11+0=11 C(r)+rankr(B,7)=11+2=13 (11,13) ⇒ C(b)+rankb(B,11)=7+0=7 C(b)+rankb(B,13)=7+2=9

(2,7)

(11,13)

(7,9)

(sp,ep-1) が S[i..m] とマッチしている範囲出現順が保存されることも利用

a の前の r は、 B 中で「最初から 2番目まで」だけであることがわかる

Page 25: 情報生命科学特別講義 III ( 2 )文字列データ構造

接尾辞配列

Page 26: 情報生命科学特別講義 III ( 2 )文字列データ構造

接尾辞配列  (suffix array) 接尾辞木と似た情報をより簡潔に表現 もとの文字列の接尾辞をソートし、接尾辞の開始位置の

みを格納した配列(図中の SA )

文字列 S SA ソートした接尾辞

Page 27: 情報生命科学特別講義 III ( 2 )文字列データ構造

接尾辞配列の性質 接尾辞木があれば簡単に構成できるが、接尾辞木を作らなくて

も O(n) 時間で直接構成可能 部分文字列検索を、単純な二分探索法で O(m log n) 時間で実行

可。より精密な方法を使えば、 O(m+log n )時間で実行可。 その他、接尾辞木でできる多くの操作が接尾辞配列でも可能(

ただし、配列以外に付加的な情報が必要になる場合もある)

部分文字列検索の例: P=abracaa: (10,7,0,3,5) ⇒ ab: (7,0) ⇒ abr: (7,0)

⇒ abra (7,0) ⇒ abrac (0)

Page 28: 情報生命科学特別講義 III ( 2 )文字列データ構造

接尾辞配列作成の線形時間アルゴリズム(1)

文字列 T SA ソートした接尾辞

DC3 アルゴリズム [Karkkainen et al., JACM 2006] を説明 アイデア: マージソート

Page 29: 情報生命科学特別講義 III ( 2 )文字列データ構造

接尾辞配列作成の線形時間アルゴリズム(2) 配列位置を3の剰余により B0,B1,B2 に分割し、 C=B1∪B2 とする

例: B1={1,4,7,10}, B2={2,5,8,11}, C={1,4,7,10,2,5,8,11}

Rk=[tktk+1tk+2][tk+3tk+4tk+5]… とし、 R=R1 ・ R2 とする

必要に応じて、末尾に $ を追加( $ < a )

Page 30: 情報生命科学特別講義 III ( 2 )文字列データ構造

接尾辞配列作成の線形時間アルゴリズム(3) R の各要素を(基数ソートで)順位づけしたものを R’ とする R’ の接尾辞配列 SAR’ を再帰的に構成

R’=(1,2,4,6,4,5,3,7,$)

順位づけ

R’ の 接尾辞配列

Page 31: 情報生命科学特別講義 III ( 2 )文字列データ構造

接尾辞配列作成の線形時間アルゴリズム(4) SAR’ により、 C=B1∪B2 の位置のソートが完了 残り B0 を Si ≦ Sj ⇔ (ti, rank(Si+1)) ≦ (tj, rank(Sj+1)) でソート

C の位置のソートが完了

S12S0 S9S6S3

S12 < S6 < S9 < S3 < S0

上記規則でソート

Si : 入力文字列の I 番目文字から始まる接尾辞rank(Si): Si の接尾辞配列における順位

Page 32: 情報生命科学特別講義 III ( 2 )文字列データ構造

接尾辞配列作成の線形時間アルゴリズム(5) C のソート結果と B0 のソート結果を以下の規則でマージ B0 vs. B1 : Si ≦ Sj ⇔ (ti, rank(Si+1)) ≦ (tj, rank(Sj+1))

B0 vs. B2 : Si ≦ Sj ⇔ (ti, ti+1, rank(Si+2)) ≦ (tj, tj+1, rank(Sj+2))

S12S0 S9S6S3

S12 < S6 < S9 < S3 < S0 S1 < S4 < S8 < S2 < S7 < S5 < S10 < S11

S12 < S1 < S6 < S4 < S9 < S3 < S8 < S2 < S7 < S5 < S10 < S11 < S0

S1 < S6 ⇔ (a, rank(S2)) < (a, rank(S7))

S3 < S8 ⇔ (b, a, rank(S5)) < (b, a, rank(S10))

マージ

マージ規則の適用例

Page 33: 情報生命科学特別講義 III ( 2 )文字列データ構造

接尾辞配列作成の線形時間アルゴリズム(6)

定理 : 接尾辞配列は線形時間で構成可能 証明:上記アルゴリズムの正当性は明らか。また、再帰呼出し

以外は線形時間。 再帰呼出しの際はデータのサイズが 2/3 になる。よって、 DC3 アルゴリズムの計算時間を T(n) とすると以下を得る。T(n)=T(2n/3)+O(n)

S12S9S6S3T

ii

i

iR

kkkkkkk

SA

BBiSBiS

BiS

BBiSRDCSA

RR

RRR

ttttttR

k

T

return

dotofor

;}|{ }|{

;}|{

/* }|{ * /);'(3

/* * /; '

;

;]][[[

21

)(DC3Procedure

210

0

21'

21

43211

をマージとをソート

はソート済み基数ソートを使うをソート

Page 34: 情報生命科学特別講義 III ( 2 )文字列データ構造

まとめ 接尾辞木

接尾辞集合をコンパクトに表現 線形時間で構成可能

BW変換 文字列をコンパクトに表現、圧縮にも有効、高速な検索が可能

接尾辞配列 接尾辞木と同様の目的、よりコンパクト 線形時間で構成可能

補足 Ukkonen アルゴリズムは O(log |Σ|) 時間のオーバーヘッドがある

が、一般のアルファベットに対して線形時間で動作するアルゴリズムも存在 [Farach: Proc. FOCS 1997]

近年ではコンパクトかつ検索その他を用意にする簡潔データ構造(succinct data structure) に関する研究が盛んに行われている