lecture9_1

計算量理論
野中成吾
前回の復習
• 文字列検索問題
– アルファベットΣ上の文章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|)