計算量理論 野中成吾 前回の復習 • 文字列検索問題 – アルファベットΣ上の文章Tのなかから、パターンP が含まれるかどうかを判定する問題。 Suffix Tree Space O( j Tjj Î j ) O( j Tj ) Query O( j Pj ) O( j Pj log j Î j ) Suffix Array O( j Tj ) O( j Pj + log j Tj ) Ideas of Suffix Tray • Suffix Treeは評価は早いがメモリが大きい • Suffix Arrayはメモリは少ないが評価が遅い • 部分的にSuffix Arrayを用いて省メモリかつ高 速な評価を実現 Suffix Tree Space O( j Tjj Î j ) O( j Tj ) Query O( j Pj ) Suffix Array O( j Tj ) Suffix Tray O( j Tj ) O( j Pj log j Î j ) O( j Pj + log j Tj ) O( j Pj + log j Î j ) 定義 • σ-node 子孫のすべての葉の数が|Σ|以上あるノード。 • Σ-node σ-nodeのうちその子孫にσ-nodeを持たないノード • Branching-Σ-node (B-node) 葉の数が|Σ|以上の子ノードを二つ以上もつノード • Other σ-node(Oσ-node) Σ/B-nodeでないσ-node • Other node (O-node) それ以外のノード ノードの判別 子孫すべての葉の数の合計は|Σ|以上か? Other Node σ-node 自分の子孫にσノードはあるか? Σ-node 自分の子供にσ-ノードが二つ以上あるか? Branching-Σ-node 上記の二つ以外のσ-node Other σ-node σ-node • σ-node以下にある葉のうち、該当する子が Other nodeであるものをSuffix Arrayで格納 • 上記の条件よりSuffix Arrayのサイズは高々j Î – 1ノードから出ている枝の本数は高々j Î j – Other nodeは高々 j Î j 以下の葉しかもたない • σ-node以下にある葉を走査するのにかかる時 間は O( j Pj + lg j Î j ) j 2 Σ-node • 子どもはすべてOther nodeである。 Branching-Σ-node • 評価する頻度が高いノードなので冗長性をもた せて高速にアクセスできるようにする。 • B-nodeの個数は高々 O( j Tj =j Î j ) – すべてがσ-nodeであるとする。σ-nodeは高々|Σ| – 先祖子孫関係にない二つの>|Σ|ノードの個数は高々 O(|T|/|Σ|)であり、その親の数は高々O(|T|/|Σ|)であ る。 • B-nodeからその高々O(|Σ|)個の子供へO(1)でア クセスできるようにテーブルなどの構造を持たせ る。:O(|T|/|Σ|)・O(|Σ|) = O(|T|) Other σ-node • 子供の数をk個とする。 • B/Σ-nodeでないので、子供にσ-nodeがただ一 つ存在。それをαとする。 • 残りのk-1個のノードは高々|Σ|個の葉しかも たない。 • 唯一のσ-nodeのインデックスをもたせ、O(1)で のアクセスを可能にする。 Suffix Tray Construction 1. Suffix Treeを作る。 2. Suffix Treeの各ノードをσ/Σ/B/O-nodeに分解 3. すべてのσ-nodeの部分木についてSuffix Arrayを構成する 4. B-nodeは子供とそれに対応するSuffix Array へのポインタを持たせたテーブルを構成する。 5. Other σ-nodeは次のσ-nodeへのインデックス を保存する。 Searching with Suffix Tray • ROOTから順にΣ/B/Oσ-nodeの各について以下を実行 – Σ-node 葉について部分文字列があるか走査O – B-node テーブルをみて次のσ-nodeがあるかをみる • あったならば、そちらを評価 • なかったならば、B-nodeのSAを走査 – Oσ-node 唯一のσ-nodeかどうかを評価する • 次がσ-nodeならば、σ-nodeを評価 • ちがうならば、葉があるかを評価 • O(1)の操作が高々|P|回 • O(|P|+lg|Σ|)の操作が高々O(1)回 • よってあわせてO(|P|+lg|Σ|)回 Suffix Tray Construction “mississippi” i$ mississippi$ pi$ p ssi i s ssippi$ ppi$ Σ={m,i,p,s} $ ppi$ ppi$ ssippi$ i si B-node ssippi$ Σ-node ppi$ σ-node Suffix Tray Construction “mississippi” i$ mississippi$ pi$ p ssi i s ssippi$ ppi$ $ ppi$ ppi$ ssippi$ i si B-node ssippi$ Σ-node ppi$ σ-node Suffix Tray Construction “mississippi” i$ mississippi$ pi$ p ssi i s ssippi$ ppi$ $ ppi$ ppi$ ssippi$ i si B-node ssippi$ Σ-node ppi$ σ-node Suffix Tray Construction “mississippi” i$ mississippi$ pi$ p ssi i s ssippi$ ppi$ $ ppi$ ppi$ ssippi$ i si B-node ssippi$ Σ-node ppi$ σ-node Suffix Tray of “mississippi” Branching-Σ-node O(|Σ|^2) Array A mississippi$ 0 pi$ 9 ppi$ 8 i$ mississippi$ p i Table A O(|T|/|Σ|) m i Array B s ippi$ 1 3 issippi$ 3 0 0 sippi$ 5 2 sissippi$ 2 0 ssippi$ 4 ssissippi$ 1 10 ppi$ ppi$ ssippi$ ppi$ Array C 6 ppi$ ssippi$ ssippi$ Array C Array B 7 $ ssi $ ppi$ i si p Σ-node O(|Σ|^2) s pi$ O(|Σ|^2) Searching “ssis” from “mississippi” Branching-Σ-node O(1)O(|P|+log|Σ|) Array A mississippi$ 0 pi$ 9 ppi$ 8 i$ mississippi$ p i Table A O(|T|/|Σ|) m i Array B s ippi$ 1 3 issippi$ 3 0 0 sippi$ 5 2 sissippi$ 2 0 ssippi$ 4 ssissippi$ 1 10 ppi$ ppi$ ssippi$ ppi$ Array C 6 ppi$ ssippi$ ssippi$ Array C Array B 7 $ ssi $ ppi$ i si p Σ-node O(|Σ|^2) s pi$ Suffix Tray Construction “ababababa” $ $ ba $ ba $ ba ba$ a $ b ab $ ab $ ab$ $ AO-node B-node Σ-node σ-node Suffix Tray Construction “ababababa” $ $ ba $ ba $ ba ba$ a $ b ab $ ab $ ab$ $ Oσ-node B-node Σ-node σ-node Suffix Tray Construction “ababababa” $ $ ba $ ba $ ba ba$ a $ b ab $ ab $ ab$ $ Oσ-node B-node Σ-node σ-node Suffix Tray Construction “ababababa” $ $ ba $ ba $ ba ba$ a $ b ab $ ab $ ab$ $ Oσ-node B-node Σ-node σ-node Suffix Tray Construction “ababababa” $ $ ba $ ba $ ba ba$ a $ b ab $ ab $ ab$ $ Oσ-node B-node Σ-node σ-node Suffix Tray of “ababababa” Branching-Σ-node $ Array A 9 Table A Σ-node a Array D b Array G Array B ba$ 2 0 Array C ab$ 3 0 $ $ 0 Other node Index D ba Array E $ 8 a $ b $ ab ba ab $ $ Index F ba Array B Array E $ ba $ $ ba ba$ ab$ $ 1 Index E ba Array F Array D $ 6 Index G ab Array H Array F $ 4 Index H ab Array C Array G $ 7 Array H $ 5 Search “baba” of “ababababa” Branching-Σ-node O(1) Array A $ 9 Table A Σ-node a Array D b Array G Array B ba$ 2 0 Array C ab$ 3 0 $ $ 0 Other node Index D ba Array E $ 8 a $ b $ ab ba ab $ $ Index F ba Array B Array E $ ba $ $ ba ba$ ab$ $ 1 Index E ba Array F Array D $ 6 Index G ab Array H Array F $ 4 Index H ab Array C Array G $ 7 Array H $ 5 Summary • Suffix Trayは部分的に高速化することで省メ モリかつ高速な走査をすることができるデー タ構造である。 • 計算コスト:O(|P|+lg|Σ|) • メモリサイズ:O(|T|)
© Copyright 2024 ExpyDoc