Slide 1

Slide 1 text

2018/12/13 D&A Advent Calendar SA-IS @izflare

Slide 2

Slide 2 text

2 内容  Suffix array は,文字列に対するデータ構造のひとつ.  全文索引として使える.  BWT や LZ77 をはじめ,他の様々なデータ構造・ アルゴリズムに利用されている.  Suffix array を文字列長に対して線形時間で構築する アルゴリズム SA-IS を紹介する.  アルゴリズムの挙動  計算量解析

Slide 3

Slide 3 text

3 文字列  記号の有限順序集合 Σ を アルファベット という.  Σ の要素の列 Σ* を 文字列 という.  文字列 T = xyz (x, y, z ∈ Σ*) について, y を T の 部分文字列 ,yz を T の 接尾辞 (suffix) という.  文字列 T と位置 i について,T[i] で T の i 番目の記号を, sT [i] で T の i 番目からはじまる suffix を表す (以降,T が明らかな場合,sT [i] を s[i] と略す). ( 例)文字列 banana$ のすべての suffix は,     s[1] = banana$,s[2] = anana$,s[3] = nana$,     s[4] = ana$,s[5] = na$,s[6] = a$,s[7] = $.

Slide 4

Slide 4 text

4 辞書順  長さ n の文字列 T と,長さ m の文字列 S について, 以下のように 辞書順 を定義する: (例)apple ≪ banana       violet ≪ violin       moral ≪ morale   T ≪ S ⇔ 以下のいずれかが成り立つ:  ある整数 i(0 ≤ i ≤ min(n, m))について, 0 ≤ j ≤ i − 1 である任意の整数 j に関して T j = S j ,かつ,t i < s i .  任意の整数 i(0 ≤ i ≤ min(n, m))について T j = S j ,かつ,n < m .

Slide 5

Slide 5 text

5 Suffix Array & SA-IS [Nong+, DCC’09]  文字列 T のすべての suffix を辞書順でソートし, suffix の開始位置を保持した配列を suffix array という.  Suffix array の構築は,愚直に行うとすべての suffix を ソートする分の時間がかかる.  例えばクイックソートなら,長さ n の文字列に対して 平均 O(n2 log n) 時間程度必要になる.  SA-IS は,suffix array を文字列長について線形時間で 構築するアルゴリズム. ( 例)文字列 banana$ の suffix array は,       [7, 6, 4, 2, 1, 5, 3].

Slide 6

Slide 6 text

6 SA-IS algorithm 入力:長さ n の文字列 T.出力:T の suffix array SA. 1. T の各 suffix を3種類に分類 1. 全体を L-type と S-type に分類 2. S-type からさらに LMS-type を選別 2. LMS-type suffix をソート 1. LMS-type を induced sorting で並び替え a. LMS-substring が一意 ⇨ ソートは完了 b. LMS-substring が一意でない   ⇨ 再帰的にSA-IS を適用し LMS-type をソート 3. Induced sorting 1. 先頭文字バケットを基に,LMS-type を配列に挿入 2. LMS-type の順序を基に L-type を配列に挿入 3. L-type の順序を基に S-type を配列に挿入

Slide 7

Slide 7 text

7 SA-IS algorithm 入力:長さ n の文字列 T.出力:T の suffix array SA. 1. T の各 suffix を3種類に分類 1. 全体を L-type と S-type に分類 2. S-type からさらに LMS-type を選別 2. LMS-type suffix をソート 1. LMS-type を induced sorting で並び替え a. LMS-substring が一意 ⇨ ソートは完了 b. LMS-substring が一意でない   ⇨ 再帰的にSA-IS を適用し LMS-type をソート 3. Induced sorting 1. 先頭文字バケットを基に,LMS-type を配列に挿入 2. LMS-type の順序を基に L-type を配列に挿入 3. L-type の順序を基に S-type を配列に挿入 まずここ

Slide 8

Slide 8 text

8 L-type, S-type, LMS-type  L-type   s[i+1] ≪ s[i] (1 ≤ i ≤ n−1) となる s[i].  S-type   s[i] ≪ s[i+1] (1 ≤ i ≤ n−1) となる s[i] および s[n].  LMS-type   s[i−1] が L-type かつ自身が S-type の s[i](2 ≤ i ≤ n) . position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ●

Slide 9

Slide 9 text

9 SA-IS algorithm 入力:長さ n の文字列 T.出力:T の suffix array SA. 1. T の各 suffix を3種類に分類 1. 全体を L-type と S-type に分類 2. S-type からさらに LMS-type を選別 2. LMS-type suffix をソート 1. LMS-type を induced sorting で並び替え a. LMS-substring が一意 ⇨ ソートは完了 b. LMS-substring が一意でない   ⇨ 再帰的にSA-IS を適用し LMS-type をソート 3. Induced sorting 1. 先頭文字バケットを基に,LMS-type を配列に挿入 2. LMS-type の順序を基に L-type を配列に挿入 3. L-type の順序を基に S-type を配列に挿入 済

Slide 10

Slide 10 text

10 SA-IS algorithm 入力:長さ n の文字列 T.出力:T の suffix array SA. 1. T の各 suffix を3種類に分類 1. 全体を L-type と S-type に分類 2. S-type からさらに LMS-type を選別 2. LMS-type suffix をソート 1. LMS-type を induced sorting で並び替え a. LMS-substring が一意 ⇨ ソートは完了 b. LMS-substring が一意でない   ⇨ 再帰的にSA-IS を適用し LMS-type をソート 3. Induced sorting 1. 先頭文字バケットを基に,LMS-type を配列に挿入 2. LMS-type の順序を基に L-type を配列に挿入 3. L-type の順序を基に S-type を配列に挿入 先にこっちやります 済

Slide 11

Slide 11 text

11 Induced Sorting に向けて(1/3)  L-type の suffix s[i] と,S-type の suffix s[j] の 先頭1文字が等しいとき,s[i] ≪ s[j] が成り立つ. (証)s[i] = ax, s[j] = ay (a ∈ Σ, x, y ∈ Σ+) とする.       x ≪ ax (= L-type) & ay (= S-type) ≪ y より,   ① x[1] ≠ a & y[1] ≠ a           ⇨ x[1] > a & y[1] < a より,x ≪ y .   ② x[1] = a & y[1] ≠ a ⇨ y[1] < a より,x ≪ y .   ③ x[1] ≠ a & y[1] = a ⇨ x[1] > a より,x ≪ y .   ④ x[1] = y[1] = a ⇨ sx[2] と sy[2] について同様 .

Slide 12

Slide 12 text

12 Induced Sorting に向けて(2/3)  S-type がソート済みなら,その順序を基にして L-type をソートできる.   ① 先頭文字毎に配列にバケットを設定.   ② S-type を各バケットの後方からソート順で格納.   ③ 配列を前方から走査し,     見つけた s[i] に対して s[i−1] が L-type     ⇨ バケットの空きの先頭に s[i−1] を追加.  逆も可能:L-type がソート済みなら,その順序を基にして S-type をソートできる. x ≪ y ⇨ ax ≪ ay 後方から走査・末尾に追加

Slide 13

Slide 13 text

13 Induced Sorting に向けて(3/3)  前ページの方法で,すべての L-type を取りこぼしなく 配列に追加できるのだろうか? ⇨ できる.   L-type の定義より,s[i+1] ≪ s[i] が成り立つ.   すなわち,L-type のひとつ後ろの suffix は,   配列中で自身より前方に追加されているはずである.   配列は前方から走査するので,取りこぼさない.  S-type はこの逆なので,配列は後方から走査する. SA ⋯ i−2 ⋯ i−1 ⋯ i ⋯ L-type L-type S-type(最初に追加済)

Slide 14

Slide 14 text

14 Induced Sorting ※ LMS-type suffix がソート済みであるとする. 1. 先頭文字バケットを基に,LMS-type を配列に挿入 1. 配列に先頭文字ごとのバケットを設定 2. LMS-type を各バケットの末尾から挿入 2. LMS-type の順序を基に L-type を配列に挿入 1. 配列を前方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が L-type なら, s[i−1] を対応するバケットの空きの先頭に挿入 2. s[i] を配列から削除 3. L-type の順序を基に S-type を配列に挿入 1. 配列を後方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が S-type なら, s[i−1] を対応するバケットの空きの末尾に挿入

Slide 15

Slide 15 text

15 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● 1. 先頭文字バケットを基に,LMS-type を配列に挿入 1. 配列に先頭文字ごとのバケットを設定 2. LMS-type を各バケットの末尾から挿入 SA bucket $ a b c d r

Slide 16

Slide 16 text

16 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● 1. 先頭文字バケットを基に,LMS-type を配列に挿入 1. 配列に先頭文字ごとのバケットを設定 2. LMS-type を各バケットの末尾から挿入 SA 12 8 4 6 bucket $ a b c d r

Slide 17

Slide 17 text

17 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● 2. LMS-type の順序を基に L-type を配列に挿入 1. 配列を前方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が L-type なら, s[i−1] を対応するバケットの空きの先頭に挿入 2. ss s[i] が LMS-type なら,配列から削除 SA 12 8 4 6 bucket $ a b c d r

Slide 18

Slide 18 text

18 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● 2. LMS-type の順序を基に L-type を配列に挿入 1. 配列を前方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が L-type なら, s[i−1] を対応するバケットの空きの先頭に挿入 2. ss s[i] が LMS-type なら,配列から削除 SA 12 8 4 6 bucket $ a b c d r

Slide 19

Slide 19 text

19 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 8 4 6 bucket $ a b c d r 2. LMS-type の順序を基に L-type を配列に挿入 1. 配列を前方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が L-type なら, s[i−1] を対応するバケットの空きの先頭に挿入 2. ss s[i] が LMS-type なら,配列から削除

Slide 20

Slide 20 text

20 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 8 4 6 bucket $ a b c d r 2. LMS-type の順序を基に L-type を配列に挿入 1. 配列を前方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が L-type なら, s[i−1] を対応するバケットの空きの先頭に挿入 2. ss s[i] が LMS-type なら,配列から削除

Slide 21

Slide 21 text

21 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 8 4 6 10 bucket $ a b c d r 2. LMS-type の順序を基に L-type を配列に挿入 1. 配列を前方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が L-type なら, s[i−1] を対応するバケットの空きの先頭に挿入 2. ss s[i] が LMS-type なら,配列から削除

Slide 22

Slide 22 text

22 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 8 4 6 10 bucket $ a b c d r 2. LMS-type の順序を基に L-type を配列に挿入 1. 配列を前方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が L-type なら, s[i−1] を対応するバケットの空きの先頭に挿入 2. ss s[i] が LMS-type なら,配列から削除

Slide 23

Slide 23 text

23 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 4 6 7 10 bucket $ a b c d r 2. LMS-type の順序を基に L-type を配列に挿入 1. 配列を前方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が L-type なら, s[i−1] を対応するバケットの空きの先頭に挿入 2. ss s[i] が LMS-type なら,配列から削除

Slide 24

Slide 24 text

24 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 4 6 7 10 bucket $ a b c d r 2. LMS-type の順序を基に L-type を配列に挿入 1. 配列を前方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が L-type なら, s[i−1] を対応するバケットの空きの先頭に挿入 2. ss s[i] が LMS-type なら,配列から削除

Slide 25

Slide 25 text

25 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 6 7 10 3 bucket $ a b c d r 2. LMS-type の順序を基に L-type を配列に挿入 1. 配列を前方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が L-type なら, s[i−1] を対応するバケットの空きの先頭に挿入 2. ss s[i] が LMS-type なら,配列から削除

Slide 26

Slide 26 text

26 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 6 7 10 3 bucket $ a b c d r 2. LMS-type の順序を基に L-type を配列に挿入 1. 配列を前方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が L-type なら, s[i−1] を対応するバケットの空きの先頭に挿入 2. ss s[i] が LMS-type なら,配列から削除

Slide 27

Slide 27 text

27 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 5 7 10 3 bucket $ a b c d r 2. LMS-type の順序を基に L-type を配列に挿入 1. 配列を前方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が L-type なら, s[i−1] を対応するバケットの空きの先頭に挿入 2. ss s[i] が LMS-type なら,配列から削除

Slide 28

Slide 28 text

28 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 5 7 10 3 bucket $ a b c d r 2. LMS-type の順序を基に L-type を配列に挿入 1. 配列を前方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が L-type なら, s[i−1] を対応するバケットの空きの先頭に挿入 2. ss s[i] が LMS-type なら,配列から削除

Slide 29

Slide 29 text

29 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 5 7 10 3 bucket $ a b c d r 2. LMS-type の順序を基に L-type を配列に挿入 1. 配列を前方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が L-type なら, s[i−1] を対応するバケットの空きの先頭に挿入 2. ss s[i] が LMS-type なら,配列から削除

Slide 30

Slide 30 text

30 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 5 7 10 3 bucket $ a b c d r 2. LMS-type の順序を基に L-type を配列に挿入 1. 配列を前方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が L-type なら, s[i−1] を対応するバケットの空きの先頭に挿入 2. ss s[i] が LMS-type なら,配列から削除

Slide 31

Slide 31 text

31 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 5 7 10 3 bucket $ a b c d r 2. LMS-type の順序を基に L-type を配列に挿入 1. 配列を前方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が L-type なら, s[i−1] を対応するバケットの空きの先頭に挿入 2. ss s[i] が LMS-type なら,配列から削除

Slide 32

Slide 32 text

32 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 5 7 10 3 bucket $ a b c d r 3. L-type の順序を基に S-type を配列に挿入 1. 配列を後方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が S-type なら, s[i−1] を対応するバケットの空きの末尾に挿入

Slide 33

Slide 33 text

33 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 5 7 10 3 bucket $ a b c d r 3. L-type の順序を基に S-type を配列に挿入 1. 配列を後方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が S-type なら, s[i−1] を対応するバケットの空きの末尾に挿入

Slide 34

Slide 34 text

34 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 2 5 7 10 3 bucket $ a b c d r 3. L-type の順序を基に S-type を配列に挿入 1. 配列を後方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が S-type なら, s[i−1] を対応するバケットの空きの末尾に挿入

Slide 35

Slide 35 text

35 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 2 5 7 10 3 bucket $ a b c d r 3. L-type の順序を基に S-type を配列に挿入 1. 配列を後方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が S-type なら, s[i−1] を対応するバケットの空きの末尾に挿入

Slide 36

Slide 36 text

36 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 9 2 5 7 10 3 bucket $ a b c d r 3. L-type の順序を基に S-type を配列に挿入 1. 配列を後方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が S-type なら, s[i−1] を対応するバケットの空きの末尾に挿入

Slide 37

Slide 37 text

37 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 9 2 5 7 10 3 bucket $ a b c d r 3. L-type の順序を基に S-type を配列に挿入 1. 配列を後方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が S-type なら, s[i−1] を対応するバケットの空きの末尾に挿入

Slide 38

Slide 38 text

38 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 6 9 2 5 7 10 3 bucket $ a b c d r 3. L-type の順序を基に S-type を配列に挿入 1. 配列を後方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が S-type なら, s[i−1] を対応するバケットの空きの末尾に挿入

Slide 39

Slide 39 text

39 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 6 9 2 5 7 10 3 bucket $ a b c d r 3. L-type の順序を基に S-type を配列に挿入 1. 配列を後方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が S-type なら, s[i−1] を対応するバケットの空きの末尾に挿入

Slide 40

Slide 40 text

40 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 4 6 9 2 5 7 10 3 bucket $ a b c d r 3. L-type の順序を基に S-type を配列に挿入 1. 配列を後方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が S-type なら, s[i−1] を対応するバケットの空きの末尾に挿入

Slide 41

Slide 41 text

41 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 4 6 9 2 5 7 10 3 bucket $ a b c d r 3. L-type の順序を基に S-type を配列に挿入 1. 配列を後方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が S-type なら, s[i−1] を対応するバケットの空きの末尾に挿入

Slide 42

Slide 42 text

42 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 1 4 6 9 2 5 7 10 3 bucket $ a b c d r 3. L-type の順序を基に S-type を配列に挿入 1. 配列を後方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が S-type なら, s[i−1] を対応するバケットの空きの末尾に挿入

Slide 43

Slide 43 text

43 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 1 4 6 9 2 5 7 10 3 bucket $ a b c d r 3. L-type の順序を基に S-type を配列に挿入 1. 配列を後方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が S-type なら, s[i−1] を対応するバケットの空きの末尾に挿入

Slide 44

Slide 44 text

44 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 8 1 4 6 9 2 5 7 10 3 bucket $ a b c d r 3. L-type の順序を基に S-type を配列に挿入 1. 配列を後方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が S-type なら, s[i−1] を対応するバケットの空きの末尾に挿入

Slide 45

Slide 45 text

45 Induced Sorting(例) position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● SA 12 11 8 1 4 6 9 2 5 7 10 3 bucket $ a b c d r 3. L-type の順序を基に S-type を配列に挿入 1. 配列を後方から走査し,suffix を探索 1. 見つけた s[i] について,s[i−1] が S-type なら, s[i−1] を対応するバケットの空きの末尾に挿入 完

Slide 46

Slide 46 text

46 SA-IS algorithm 入力:長さ n の文字列 T.出力:T の suffix array SA. 1. T の各 suffix を3種類に分類 1. 全体を L-type と S-type に分類 2. S-type からさらに LMS-type を選別 2. LMS-type suffix をソート 1. LMS-type を induced sorting で並び替え a. LMS-substring が一意 ⇨ ソートは完了 b. LMS-substring が一意でない   ⇨ 再帰的にSA-IS を適用し LMS-type をソート 3. Induced sorting 1. 先頭文字バケットを基に,LMS-type を配列に挿入 2. LMS-type の順序を基に L-type を配列に挿入 3. L-type の順序を基に S-type を配列に挿入 済 済

Slide 47

Slide 47 text

47 SA-IS algorithm 入力:長さ n の文字列 T.出力:T の suffix array SA. 1. T の各 suffix を3種類に分類 1. 全体を L-type と S-type に分類 2. S-type からさらに LMS-type を選別 2. LMS-type suffix をソート 1. LMS-type を induced sorting で並び替え a. LMS-substring が一意 ⇨ ソートは完了 b. LMS-substring が一意でない   ⇨ 再帰的にSA-IS を適用し LMS-type をソート 3. Induced sorting 1. 先頭文字バケットを基に,LMS-type を配列に挿入 2. LMS-type の順序を基に L-type を配列に挿入 3. L-type の順序を基に S-type を配列に挿入 済 済 最後にここ

Slide 48

Slide 48 text

48 LMS-substring  LMS-substring   s[i], s[j] (i < j) が間に LMS のない LMS-type のとき   i 〜 j 番目,または,n 番目のみからなる部分文字列. position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● A = a c a B = a d a C =               a b r a $ D =                             $

Slide 49

Slide 49 text

49 Sorting LMS-type(a. 1/3)  文字列は,LMS-substring を結合したものと見做せる.  各LMS-substring が一意のとき,LMS-type suffix の順序は LMS-substring の順序のみから求まる. position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● A = a c a B = a d a C =               a b r a $ D =                             $ ABCD, BCD, CD, D の 順序は,A, B, C, D の 順序から求まる. a. LMS-sub 一意

Slide 50

Slide 50 text

50 Sorting LMS-type(a. 1/3)  文字列は,LMS-substring を結合したものと見做せる.  各LMS-substring が一意のとき,LMS-type suffix の順序は LMS-substring の順序のみから求まる. position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● A = a c a B = a d a C =               a b r a $ D =                             $ ABCD, BCD, CD, D の 順序は,A, B, C, D の 順序から求まる. a. LMS-sub 一意 ⇨ LMS-type suffix をソートするには,   LMS-substring をソートできればよい.

Slide 51

Slide 51 text

51 Sorting LMS-type(a. 2/3)  SA-IS の 3. induced sorting では,LMS-type の順序を 基準に L/S-type suffix をソートした. ⇨ より正確には,各 LMS-type を基準に,   それより前の L/S-type suffix をソートした. position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ● 毎回ひとつ前を 調べて挿入した   ⇨ 共通する LMS-type を末尾にもつ suffix は,     その末尾の順序を基準にソートできる.

Slide 52

Slide 52 text

52 Sorting LMS-type(a. 3/3)  Induced sorting は,LMS-substring の各 suffix を, その末尾文字の順序を最初の基準としてソートしている. ⇨ 各 LMS-substring の末尾文字をバケットに格納し   induced sorting すれば LMS-substring をソートできる. position 1 2 3 4 5 6 7 8 9 10 11 12 T a b r a c a d a b r a $ L/S-type S S L S L S L S S L L S LMS-type ● ● ● ●  実際には,適当な順番で LMS-type をバケットに 突っ込み induced sorting するだけで SA が完成する.

Slide 53

Slide 53 text

53 Sorting LMS-type(b. 1/2)  各 LMS-substring が一意でないときは, LMS-sub をソートしても LMS-type suffix の順序は不明. b. LMS-sub が   一意でない ♠, ♣, ♥, ♦ がこの順で出現する LMS-substring のとき ♦ ≪ ♣ ≪ ♥ ≪ ♠ ⇒ ♦ ≪ ♣♥♦ ≪ ♥♦ ≪ ♠♣♥♦ . 各LMS-substring が一意 各LMS-substring が一意でない 先頭だけで順序が求まる ♠, ♣, ♠, ♦ がこの順で出現する LMS-substring のとき ♦ ≪ ♣ ≪ ♠ ⇒ ♦ ≪ ♣♠♦ ≪ ♠♣♠♦ ? ♠♦ . 先頭だけでは順序が求まらない

Slide 54

Slide 54 text

54 Sorting LMS-type(b. 2/2)  元の文字列 T の LMS-type suffix の順序を得るために, ♠♣♠♦, ♣♠♦, ♠♦, ♦ の順序を知りたい. ⇨ 文字列 T' = ♠♣♠♦ の suffix をソートしたい.   ⇨ SA-IS で T' の suffix array を求めればソートできる.  T' ♠ の文字( , ♣, ♦)の辞書順は, T の LMS-substring の induced sorting で計算済. ♠, ♣, ♦ は T の LMS-substring ♠, ♣, ♠, ♦ がこの順で出現する LMS-substring で, induced sorting により ♦ ≪ ♣ ≪ ♠ と求まった. ⇨(たとえば)♦ = a, ♣ = b, ♠ = c として,SA-IS で   ♠♣♠♦ = cbca の suffix array を計算すればよい.

Slide 55

Slide 55 text

55 SA-IS algorithm 入力:長さ n の文字列 T.出力:T の suffix array SA. 1. T の各 suffix を3種類に分類 1. 全体を L-type と S-type に分類 2. S-type からさらに LMS-type を選別 2. LMS-type suffix をソート 1. LMS-type を induced sorting で並び替え a. LMS-substring が一意 ⇨ ソートは完了 b. LMS-substring が一意でない   ⇨ 再帰的にSA-IS を適用し LMS-type をソート 3. Induced sorting 1. 先頭文字バケットを基に,LMS-type を配列に挿入 2. LMS-type の順序を基に L-type を配列に挿入 3. L-type の順序を基に S-type を配列に挿入 済 済 済 完

Slide 56

Slide 56 text

56 SA-IS 計算量解析 入力:長さ n の文字列 T.出力:T の suffix array SA. 1. T の各 suffix を3種類に分類 1. 全体を L-type と S-type に分類 2. S-type からさらに LMS-type を選別 2. LMS-type suffix をソート 1. LMS-type を induced sorting で並び替え a. LMS-substring が一意 ⇨ ソートは完了 b. LMS-substring が一意でない   ⇨ 再帰的にSA-IS を適用し LMS-type をソート 3. Induced sorting 1. 先頭文字バケットを基に,LMS-type を配列に挿入 2. LMS-type の順序を基に L-type を配列に挿入 3. L-type の順序を基に S-type を配列に挿入 線形 線形 線形 線形 線形 線形

Slide 57

Slide 57 text

57 SA-IS 計算量解析 入力:長さ n の文字列 T.出力:T の suffix array SA. 1. T の各 suffix を3種類に分類 1. 全体を L-type と S-type に分類 2. S-type からさらに LMS-type を選別 2. LMS-type suffix をソート 1. LMS-type を induced sorting で並び替え a. LMS-substring が一意 ⇨ ソートは完了 b. LMS-substring が一意でない   ⇨ 再帰的にSA-IS を適用し LMS-type をソート 3. Induced sorting 1. 先頭文字バケットを基に,LMS-type を配列に挿入 2. LMS-type の順序を基に L-type を配列に挿入 3. L-type の順序を基に S-type を配列に挿入 線形 線形 線形 線形 線形 線形 ?

Slide 58

Slide 58 text

58 LMS-sub 一意性判定の計算量  文字列中に出現するすべての LMS-substring が 一意か否か判定するのにかかる時間計算量は?  2. 1. で induced sorting(線形時間)した後, LMS-substring は辞書順に並べられる(同率含む). ⇨ 隣り合うもの同士だけを比べれば判定できる.  文字列の比較は1文字ずつを比べていくため, O(文字列長) 時間かかってしまう. ⇨ すべての LMS-substring の長さを足し合わせても,   高々 ( 元文字列長 + LMS-type suffix の出現回数) で収まる. ⇨ LMS-substring の一意性判定は 線形時間 で可能. 1文字 重複する

Slide 59

Slide 59 text

59 SA-IS 再帰の計算量  LMS-substring が一意でないときの, 再帰的な SA-IS の適用でかかる総時間計算量は?  LMS-type suffix は,s[i−1] が L-type かつ 自身が S-type の s[i](2 ≤ i ≤ n). ⇨ LMS-substring の長さは必ず 2 以上で,   これを置き換えた文字をつなげて作る文字列は,   再帰毎に長さが半分以下になる.   ここで,最初の入力文字列長 n に対して,   n + n/2 + n/22 + n/23 + ... + n/2log n < 2n である. ⇨ 再帰の総時間計算量は 線形 で抑えられる. LMS-type 同士は 隣り合わない

Slide 60

Slide 60 text

60 SA-IS 計算量解析 入力:長さ n の文字列 T.出力:T の suffix array SA. 1. T の各 suffix を3種類に分類 1. 全体を L-type と S-type に分類 2. S-type からさらに LMS-type を選別 2. LMS-type suffix をソート 1. LMS-type を induced sorting で並び替え a. LMS-substring が一意 ⇨ ソートは完了 b. LMS-substring が一意でない   ⇨ 再帰的にSA-IS を適用し LMS-type をソート 3. Induced sorting 1. 先頭文字バケットを基に,LMS-type を配列に挿入 2. LMS-type の順序を基に L-type を配列に挿入 3. L-type の順序を基に S-type を配列に挿入 線形 線形 線形 線形 線形 線形 線形

Slide 61

Slide 61 text

61 まとめ  Summary  Suffix array は,文字列の suffix を辞書順でソートし, その開始位置を保持した配列.  SA-IS は,文字列長に対して線形時間で suffix array を 構築するアルゴリズム. 1. suffix を L/S/LMS-type に分類. 2. LMS-type suffix をソート(再帰あり). 3. induced sorting で L/S-type suffix をソート.  Reference  Udi Manber, Gene Myers: Suffix arrays: a new method for on-line string searches (SODA’90).  Ge Nong, Sen Zhang, Wai Hong Chan: Linear Suffix Array Construction by Almost Pure Induced-Sorting (DCC’09).