Upgrade to Pro — share decks privately, control downloads, hide ads and more …

201909_StringBeginners_Palindrome_Shawna

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →
Avatar for Shawna Shawna
September 20, 2019
90

 201909_StringBeginners_Palindrome_Shawna

StringBeginners(https://sites.google.com/view/stringbeginners/workshop) にて発表

Avatar for Shawna

Shawna

September 20, 2019

Transcript

  1. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. 極大回文を O(n) 時間で列挙するアルゴリズム
 文字列上の回文を見てみる
  2. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  たけやぶやけた •  よのなかねかおかおかねかなのよ そもそも回文ってなんだっけ
  3. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  長さ n の文字列上に存在する回文は最大いくつ? 回文の個数 a a a a a a a a a a a a a a a a a a a a
  4. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  代表的な回文(極大回文)を 2n-1 個保持すれば, すべての回文を保持できる. 極大回文 a a b a a b a a b a b a a b b a a a b a
  5. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  長さ n の文字列 w に出現する極大回文を O(n) 時間で すべて列挙する. •  偶回文(長さが偶数の回文)のみ考える. •  奇回文(長さが奇数の回文)は,もとの文字列を2倍に すれば求まる. •  文字列 w に出現する極大回文の集合を MPals(w) とする. •  位置 c を中心とする長さ 2r の回文を Pal(c, r) とする. 極大回文を列挙してみる(準備)
  6. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  w[1..c-1] 上の極大回文はすべて列挙できているとし, 位置 c を中心とする極大回文を計算する. •  MPals(c, r) は,r 時間で計算できる. 極大回文を列挙してみる [Manacher, 1975] w c r r
  7. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  任意の Pal(c, r) ∈ MPals(w),0 < d ≤ r に対して, Pal(c-d, rl ), Pal(c+d, rr ) ∈ MPals(w) は, (1)~(3) のいずれかを満たす. •  (1) rl < r-d à rr = rl •  (2) rl = r-d à rr ≥ r-d •  (3) rl > r-d à rr = r-d 極大回文を列挙してみる(補題) w c r r
  8. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  任意の Pal(c, r) ∈ MPals(w),0 < d ≤ r に対して, Pal(c-d, rl ), Pal(c+d, rr ) ∈ MPals(w) は, (1)~(3) のいずれかを満たす. •  (1) rl < r-d à rr = rl •  (2) rl = r-d à rr ≥ r-d •  (3) rl > r-d à rr = r-d 極大回文を列挙してみる(補題) w c r r d rl (1)
  9. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  任意の Pal(c, r) ∈ MPals(w),0 < d ≤ r に対して, Pal(c-d, rl ), Pal(c+d, rr ) ∈ MPals(w) は, (1)~(3) のいずれかを満たす. •  (1) rl < r-d à rr = rl •  (2) rl = r-d à rr ≥ r-d •  (3) rl > r-d à rr = r-d 極大回文を列挙してみる(補題) w c r r d rl (1) d rr
  10. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  任意の Pal(c, r) ∈ MPals(w),0 < d ≤ r に対して, Pal(c-d, rl ), Pal(c+d, rr ) ∈ MPals(w) は, (1)~(3) のいずれかを満たす. •  (1) rl < r-d à rr = rl •  (2) rl = r-d à rr ≥ r-d •  (3) rl > r-d à rr = r-d 極大回文を列挙してみる(補題) w c r r d rl (2)
  11. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  任意の Pal(c, r) ∈ MPals(w),0 < d ≤ r に対して, Pal(c-d, rl ), Pal(c+d, rr ) ∈ MPals(w) は, (1)~(3) のいずれかを満たす. •  (1) rl < r-d à rr = rl •  (2) rl = r-d à rr ≥ r-d •  (3) rl > r-d à rr = r-d 極大回文を列挙してみる(補題) w c r r d rl (2) d rr
  12. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  任意の Pal(c, r) ∈ MPals(w),0 < d ≤ r に対して, Pal(c-d, rl ), Pal(c+d, rr ) ∈ MPals(w) は, (1)~(3) のいずれかを満たす. •  (1) rl < r-d à rr = rl •  (2) rl = r-d à rr ≥ r-d •  (3) rl > r-d à rr = r-d 極大回文を列挙してみる(補題) w c r r d rl (2) d a b b b rr
  13. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  任意の Pal(c, r) ∈ MPals(w),0 < d ≤ r に対して, Pal(c-d, rl ), Pal(c+d, rr ) ∈ MPals(w) は, (1)~(3) のいずれかを満たす. •  (1) rl < r-d à rr = rl •  (2) rl = r-d à rr ≥ r-d •  (3) rl > r-d à rr = r-d 極大回文を列挙してみる(補題) w c r r d rl (3)
  14. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  任意の Pal(c, r) ∈ MPals(w),0 < d ≤ r に対して, Pal(c-d, rl ), Pal(c+d, rr ) ∈ MPals(w) は, (1)~(3) のいずれかを満たす. •  (1) rl < r-d à rr = rl •  (2) rl = r-d à rr ≥ r-d •  (3) rl > r-d à rr = r-d 極大回文を列挙してみる(補題) w c r r d (3) d rr rl
  15. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  任意の Pal(c, r) ∈ MPals(w),0 < d ≤ r に対して, Pal(c-d, rl ), Pal(c+d, rr ) ∈ MPals(w) は, (1)~(3) のいずれかを満たす. •  (1) rl < r-d à rr = rl •  (2) rl = r-d à rr ≥ r-d •  (3) rl > r-d à rr = r-d 極大回文を列挙してみる(補題) w c r r d (3) d rr rl b b b a
  16. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  任意の Pal(c, r) ∈ MPals(w),0 < d ≤ r に対して, Pal(c-d, rl ), Pal(c+d, rr ) ∈ MPals(w) は, (1)~(3) のいずれかを満たす. •  (1) rl < r-d à rr = rl •  (2) rl = r-d à rr ≥ r-d •  (3) rl > r-d à rr = r-d 極大回文を列挙してみる(補題) w c r r d (3) d rr rl b b b a
  17. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. 極大回文を列挙してみる w c r r d rl •  w[1..c-1] 上の極大回文はすべて列挙できているとし, 位置 c を中心とする極大回文を計算する. •  MPals(c, r) は,r 時間で計算できる. •  (1) rl < r-d à rr = rl  (2) rl = r-d à rr ≥ r-d (3) rl > r-d à rr = r-d •  c より左の位置を中心とする極大回文を右から順に見ていく. –  (1), (3) の場合,右にコピーする.次の極大回文を計算する. –  (2) の場合,(2) の反対側の位置を中心として, 左右に延ばし,極大回文を求める. この極大回文を MPals(c, r) とする.
  18. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. 接頭辞回文を O(log n) 個の等差数列で保持できることの証明
 ある位置から始まる回文を見てみる
  19. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  長さ n の文字列上の ある位置 i を開始位置とする回文はいくつ? 始点を基準に回文を見てみる
  20. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  極大回文をすべて保持しておけば, i について計算すれば,位置 i を開始位置とする回文は 計算できるが, 今日はとりあえず置いておく. •  位置 i を開始位置とする回文を, O(log (n-i)) 個の等差数列で保持する. •  かんたんのため(毎回 n-i と書くのが面倒なため), 接頭辞回文を O(log n) 個の等差数列で保持する場合を考 える. 開始位置を基準に回文を保持する [Apostolico, 1995]
  21. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  PPals(w):文字列 w 上の接頭辞回文の集合 •  PPals(w) = {w[1..a1 ], w[1..a2 ], …, w[1,ak ] } ただし a1 < a2 < … < ak とする •  ai +1 = ai + di •  TR:T の逆文字列 O(log n) 個の等差数列で保持するための準備 w a1 a2 a3 d2
  22. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  w[1..q] ∈ PPals(w), 1 ≤ i < j ≤ q を満たす任意の数 q につ いて, w[i..j] = w[q-j+1..q-i+1]R O(log n) 個の等差数列で保持するための補題(1) w q i j
  23. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  任意の a と d について, w[1..a], w[1..a+d] ∈ PPals(w) かつ a-d ≥ 0 ならば w[1..a-d] ∈ PPals(w) •  w[1..a-d] = w[a-(a-d)+1..a-a+1]R = w[d+1..a]R = (w[(a+d)-a+1..(a+d)-(d+1)+1]R)R = w[d+1..a] = w[1..a-d]R (参考 :補題(1)w[i..j] = w[q-j+1..q-i+1]R) •  同じ理由で a-2d も a-3d も… à 等差数列で保持できる w a a+d a-d O(log n) 個の等差数列で保持するための補題(2)
  24. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  di ≤ di+1 が成り立つ. •  di > di+1 と仮定する. w[1..ai+1 ], w[1..ai+1 +di+1 ] (= w[1..ai+2 ]) ∈ PPals(w) より, w[1..ai+1 -di+1 ] ∈PPals(w). ∵ 補題(2) ai = ai+1 -di < ai+1 -di+1 < ai+1 w[1..ai ] の次に長い接頭辞回文は w[1..ai+1 ] あることに反 する. O(log n) 個の等差数列で保持するための補題(3)
  25. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  di ≠ di+1 のとき, di+1 ≥ di + di-1 が成り立つ. •  補題(2)より, w[1..ai+1 -di+1 ] ∈ PPals(w).   ai+1 -di+1 = aj (1 ≤ j ≤ i)とおく. di+1 = ai+1 -aj = = di ≠ di+1 より, j < i.(もし j = i だと,di+1 = = di ) よって、 di+1 = ≥ di + di-1 (al+1 -al ) dl l= j i ∑ l= j i ∑ dl l=i i ∑ dl l= j i ∑ O(log n) 個の等差数列で保持するための補題(4)
  26. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  di = di+1 を満たすあいだは,1つの等差数列で保持できる. •  等差数列にならない状況を詰め込む (di ≠ di+1 ばかりにする).    2        3    di-1 + di-2   di = 2, 3, 5, 8, 13, 21, 34, … O(log n) 個の等差数列で保持する i = 1 i = 2 i > 2 di
  27. HABATAKITAI Laboratory Everything is String. 元 HABATAKITAI Laboratory Everything is

    String. •  di = di+1 を満たすあいだは,1つの等差数列で保持できる. •  等差数列にならない状況を詰め込む (di ≠ di+1 ばかりにする).   di = 2, 3, 5, 8, 13, 21, 34, … •  ところで,フィボナッチ数列を思い出してみる.  Fi = 1, 1, 2, 3, 5, 8, 13, 21, 34, … •  フィボナッチ数列の一般項を調べて,いい感じに式変形する だけ.(わからなかったら聞いてください) O(log n) 個の等差数列で保持する