$30 off During Our Annual Pro Sale. View Details »

SA-IS

flare
December 13, 2018

 SA-IS

flare

December 13, 2018
Tweet

Other Decks in Science

Transcript

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

  2. 2 内容  Suffix array は,文字列に対するデータ構造のひとつ.  全文索引として使える.  BWT

    や LZ77 をはじめ,他の様々なデータ構造・ アルゴリズムに利用されている.  Suffix array を文字列長に対して線形時間で構築する アルゴリズム SA-IS を紹介する.  アルゴリズムの挙動  計算量解析
  3. 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] = $.
  4. 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 .
  5. 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].
  6. 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 を配列に挿入
  7. 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 を配列に挿入 まずここ
  8. 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 • • • •
  9. 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 を配列に挿入 済
  10. 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 を配列に挿入 先にこっちやります 済
  11. 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] について同様 .
  12. 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 後方から走査・末尾に追加
  13. 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(最初に追加済)
  14. 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] を対応するバケットの空きの末尾に挿入
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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 なら,配列から削除
  20. 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 なら,配列から削除
  21. 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 なら,配列から削除
  22. 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 なら,配列から削除
  23. 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 なら,配列から削除
  24. 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 なら,配列から削除
  25. 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 なら,配列から削除
  26. 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 なら,配列から削除
  27. 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 なら,配列から削除
  28. 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 なら,配列から削除
  29. 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 なら,配列から削除
  30. 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 なら,配列から削除
  31. 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 なら,配列から削除
  32. 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] を対応するバケットの空きの末尾に挿入
  33. 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] を対応するバケットの空きの末尾に挿入
  34. 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] を対応するバケットの空きの末尾に挿入
  35. 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] を対応するバケットの空きの末尾に挿入
  36. 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] を対応するバケットの空きの末尾に挿入
  37. 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] を対応するバケットの空きの末尾に挿入
  38. 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] を対応するバケットの空きの末尾に挿入
  39. 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] を対応するバケットの空きの末尾に挿入
  40. 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] を対応するバケットの空きの末尾に挿入
  41. 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] を対応するバケットの空きの末尾に挿入
  42. 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] を対応するバケットの空きの末尾に挿入
  43. 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] を対応するバケットの空きの末尾に挿入
  44. 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] を対応するバケットの空きの末尾に挿入
  45. 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] を対応するバケットの空きの末尾に挿入 完
  46. 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 を配列に挿入 済 済
  47. 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 を配列に挿入 済 済 最後にここ
  48. 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 =                             $
  49. 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 一意
  50. 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 をソートできればよい.
  51. 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 は,     その末尾の順序を基準にソートできる.
  52. 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 が完成する.
  53. 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 のとき ♦ ≪ ♣ ≪ ♠ ⇒ ♦ ≪ ♣♠♦ ≪ ♠♣♠♦ ? ♠♦ . 先頭だけでは順序が求まらない
  54. 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 を計算すればよい.
  55. 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 を配列に挿入 済 済 済 完
  56. 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 を配列に挿入 線形 線形 線形 線形 線形 線形
  57. 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 を配列に挿入 線形 線形 線形 線形 線形 線形 ?
  58. 58 LMS-sub 一意性判定の計算量  文字列中に出現するすべての LMS-substring が 一意か否か判定するのにかかる時間計算量は?  2.

    1. で induced sorting(線形時間)した後, LMS-substring は辞書順に並べられる(同率含む). ⇨ 隣り合うもの同士だけを比べれば判定できる.  文字列の比較は1文字ずつを比べていくため, O(文字列長) 時間かかってしまう. ⇨ すべての LMS-substring の長さを足し合わせても,   高々 ( 元文字列長 + LMS-type suffix の出現回数) で収まる. ⇨ LMS-substring の一意性判定は 線形時間 で可能. 1文字 重複する
  59. 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 同士は 隣り合わない
  60. 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 を配列に挿入 線形 線形 線形 線形 線形 線形 線形
  61. 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).