50
Palindromic Tree @__MATH

Palindromic tree

  • Upload
    math

  • View
    1.202

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Palindromic tree

Palindromic Tree@__MATH

Page 2: Palindromic tree

Palindromic Tree(Eertree) とは•Mikhail Rubinchik さんが作ったデータ構造• 昔 codeforces にも参加されていた• 割と最近に発表された、 2015 年 ?

Page 3: Palindromic tree

何ができるの?•文字列に含まれる全てのユニークな回文を求める• それぞれの出現回数も求められる• i 番目が最後尾となるような、異なる長さの回文を求める•構築がオンラインで出来る•空間 : O(nσ) (n は文字列の長さ、 σ は文字種 )• 入力がランダムな文字列の場合 expected O(√nσ) らしい•計算 : O(n)

Page 4: Palindromic tree

何ができるの?•文字列に含まれる全てのユニークな回文を求める• それぞれの出現回数も求められる

S = “eertreere” の時“e” : 5 回 , ”r” : 3 回 , ”t” : 1 回“ee” : 2 回 , “rtr” : 1 回 , “ere” : 1 回“ertre” : 1 回 , “eertree” : 1 回

Page 5: Palindromic tree

何ができるの?• i 番目が最後尾となるような、異なる長さの回文を求める

S = “eertreere” の時、 i = 5 が最後尾となるような回文は “ ertre”, ”e” の 2 個◦ 0-indexed

Page 6: Palindromic tree

見た目• S = “eertreere” の時

Page 7: Palindromic tree

見た目 (-1)(0)

r t e

eeere

reerertre

eertree

rtr

• S = “eertreere” の時

Page 8: Palindromic tree

見た目 (-1)(0)

r t e

eeere

reerertre

eertree

rtr

• S = “eertreere” の時•見づらい•辺を減らして表示

Page 9: Palindromic tree

見た目 (-1)(0)

r t e

eeere

reerertre

eertree

rtr

• S = “eertreere” の時

S に含まれている回文が頂点

Page 10: Palindromic tree

見た目 (-1)(0)

r t e

eeere

reerertre

eertree

rtr

• S = “eertreere” の時

S に含まれている回文が頂点

長さが -1 の特殊な頂点長さが 0 の特殊な頂点

Page 11: Palindromic tree

見た目 (-1)(0)

r t e

eeere

reerertre

eertree

rtr

• S = “eertreere” の時

Page 12: Palindromic tree

見た目 (-1)(0)

r t e

eeere

reerertre

eertree

rtr

• S = “eertreere” の時一つ前の回文の両側に一文字足して出来る回文に辺を張る

Page 13: Palindromic tree

見た目 (-1)(0)

r t e

eeere

reerertre

eertree

rtr

• S = “eertreere” の時一つ前の回文の両側に一文字足して出来る回文に辺を張る

長さが 1 の回文は長さが -1 の回文から作る

Page 14: Palindromic tree

見た目 (-1)(0)

r t e

eeere

reerertre

eertree

rtr

• S = “eertreere” の時Suffix Link

Page 15: Palindromic tree

見た目 (-1)(0)

r t e

eeere

reerertre

eertree

rtr

• S = “eertreere” の時

頂点の文字列に含まれる最大の回文接尾辞へ suffix link を張る

Suffix Link

Page 16: Palindromic tree

接尾辞•文字列の接尾辞とは、(開始位置を異にし終端位置を元の文字列と同じくする部分文字列)• Wikipedia より• https://ja.wikipedia.org/wiki/接尾辞配列• S = “eertre” の時

eertre ertre rtre tre re e

Page 17: Palindromic tree

見た目 (-1)(0)

r t e

eeere

reerertre

eertree

rtr

• S = “eertreere” の時

頂点の文字列に含まれる最大の回文接尾辞へ suffix link を張る

Suffix Link

長さが 1 の頂点からは、長さ 0 の頂点へ

Page 18: Palindromic tree

見た目 (-1)(0)

r t e

eeere

reerertre

eertree

rtr

• S = “eertreere” の時

頂点の文字列に含まれる最大の回文接尾辞へ suffix link を張る

Suffix Link

長さが 1 の頂点からは、長さ 0 の頂点へ長さが 0 の頂点からは、長さ -1 の頂点へ

Page 19: Palindromic tree

見た目 (-1)(0)

r t e

eeere

reerertre

eertree

rtr

• S = “eertreere” の時

 完成Suffix Link

Page 20: Palindromic tree

Palindromic Tree のデータ構造•木を 3 つ同時に作っていくデータ構造• 長さが偶数の頂点と、それらを結ぶ辺で構成される木• 長さが奇数の頂点と、それらを結ぶ辺で構成される木• 全ての頂点を suffix link で結んだ木 (-1)

(0)

r t e

eeere rtr

Page 21: Palindromic tree

Suffix Link tree全ての頂点を suffix link で結んだ木◦ これが便利◦ 公式の呼び方はなさそう?

(-1)

(0)

r t e

ee erertr

Page 22: Palindromic tree

作り方 (-1)(0)

r e

ee

• S = “eer” まで完成

Page 23: Palindromic tree

作り方 (-1)(0)

r e

ee

• S = “eer” まで完成

“eer” の最長の回文接尾辞

Page 24: Palindromic tree

作り方 (-1)(0)

r e

ee

• S = “eer” まで完成“eert” の頂点を作るS += “t”

Page 25: Palindromic tree

作り方 (-1)(0)

r e

ee

• S = “eer” まで完成“eert” の Palindromic tree を作る• S += “t”• “t” + “r” + “t” は” eert” の回文接尾辞ではない

trt?

Page 26: Palindromic tree

作り方 (-1)(0)

r e

ee

• S = “eer” まで完成“eert” の Palindromic tree を作る• S += “t”• “t” + “r” + “t” は” eert” の回文接尾辞ではない• Suffix link を辿り “ (0)” へ移動

Page 27: Palindromic tree

作り方 (-1)(0)

r e

ee

• S = “eer” まで完成“eert” の Palindromic tree を作る• S += “t”• “t” + “r” + “t” は” eert” の回文接尾辞ではない• Suffix link を辿り “ (0)” へ移動• “t” + “” + “t” は” eert” の回文接尾辞ではない

tt?

Page 28: Palindromic tree

作り方 (-1)(0)

r e

ee

• S = “eer” まで完成“eert” の Palindromic tree を作る• S += “t”• “t” + “r” + “t” は” eert” の回文接尾辞ではない• Suffix link を辿り “ (0)” へ移動• “t” + “” + “t” は” eert” の回文接尾辞ではない• Suffix link を辿り “ (-1)” へ移動

Page 29: Palindromic tree

作り方 (-1)(0)

r e

ee

• S = “eer” まで完成“eert” の Palindromic tree を作る• S += “t”• “t” + “r” + “t” は” eert” の回文接尾辞ではない• Suffix link を辿り “ (0)” へ移動• “t” + “” + “t” は” eert” の回文接尾辞ではない• Suffix link を辿り “ (-1)” へ移動• “t” は” eert” の回文接尾辞 !!

t

Page 30: Palindromic tree

作り方 (-1)(0)

r t e

ee

• S = “eertr” まで完成

rtr

Page 31: Palindromic tree

作り方 (-1)(0)

r t e

ee

• S = “eertr” まで完成

rtr

“eertr” の最長の回文接尾辞

Page 32: Palindromic tree

作り方 (-1)(0)

r t e

ee

• S = “eertr” まで完成“eertre” の Palindromic treeを作る• S += “e”

rtr

Page 33: Palindromic tree

作り方 (-1)(0)

r t e

ee

• S = “eertr” まで完成“eertre” の頂点を作るS += “e”

“e” + “rtr” + “e” は “ eertre” の回文接尾辞 rtr

ertre?

Page 34: Palindromic tree

作り方 (-1)(0)

r t e

ee

• S = “eertr” まで完成“eertre” の Palindromic treeを作る• S += “e”

“e” + “rtr” + “e” は “ eertre” の回文接尾辞 rtr

ertre“eertre” の最長の回文接尾辞

Page 35: Palindromic tree

作り方 (-1)(0)

r t e

ee

• Suffix Link の追加• 元いた頂点 “ rtr” から、 suffix linkを辿って “ r” へ移動

rtr

ertre

Page 36: Palindromic tree

作り方 (-1)(0)

r t e

ee

• Suffix Link の追加• 元いた頂点 “ rtr” から、 suffix linkを辿って “ r” へ移動• “ere” は “ ertre” の回文接尾辞ではない

rtr

ertre

ere

Page 37: Palindromic tree

作り方 (-1)(0)

r t e

ee

• Suffix Link の追加• 元いた頂点 “ rtr” から、 suffix linkを辿って “ r” へ移動• “ere” は “ ertre” の回文接尾辞ではない• “r” から、 suffix link を辿って” (0)” へ 移動 rtr

ertre

Page 38: Palindromic tree

作り方 (-1)(0)

r t e

ee

• Suffix Link の追加• 元いた頂点 “ rtr” から、 suffix linkを辿って “ r” へ移動• “ere” は “ ertre” の回文接尾辞ではない• “r” から、 suffix link を辿って” (0)” へ 移動• “ee” は” ertre” の回文接尾辞ではない rtr

ertre

Page 39: Palindromic tree

作り方 (-1)(0)

r t e

ee

• Suffix Link の追加• 元いた頂点 “ rtr” から、 suffix linkを辿って “ r” へ移動• “ere” は “ ertre” の回文接尾辞ではない• “r” から、 suffix link を辿って” (0)” へ移動• “ee” は” ertre” の回文接尾辞ではない• “(0)” から、 suffix link を辿って” (-1)” へ移動

rtr

ertre

Page 40: Palindromic tree

作り方 (-1)(0)

r t e

ee

• Suffix Link の追加• 元いた頂点 “ rtr” から、 suffix linkを辿って “ r” へ移動• “ere” は “ ertre” の回文接尾辞ではない• “r” から、 suffix link を辿って” (0)” へ移動• “ee” は” ertre” の回文接尾辞ではない• “(0)” から、 suffix link を辿って” (-

1)” へ移動• “e” は” ertre” の回文接尾辞 !!

rtr

ertre

Page 41: Palindromic tree

何ができるの? ( 再掲 )•文字列に含まれる全てのユニークな回文を求める• それぞれの出現回数も求められる• i 番目が最後尾となるような、異なる長さの回文を求める

Page 42: Palindromic tree

何ができるの?•文字列に含まれる全てのユニークな回文を求める• 頂点数 - 2 すればよい

(0),(-1) の頂点を除く必要あり (-1)(0)

r t

e

ee

erereer

ertre

eertree

rtr

Page 43: Palindromic tree

何ができるの?•文字列に含まれる全てのユニークな回文を求める• 頂点数 - 2 すればよい•i 番目が最後尾となるような、異なる長さの回文を求める

Page 44: Palindromic tree

何ができるの?•文字列に含まれる全てのユニークな回文を求める• 頂点数 - 2 すればよい• i 番目が最後尾となるような、異なる長さの回文を求める• Suffix link tree の深さと一致する• S = “eertreere” の時、 i = 5 が最後尾となるような回文は“ ertre”, ”e” の 2 個

(-1)(0)eertre

Page 45: Palindromic tree

計算量 (-1)

(0)

r t e

ee

• 新しい頂点を追加するのにかかる計算量は?

rtr

Page 46: Palindromic tree

計算量 (-1)

(0)

r t e

ee

• 新しい頂点を追加するのにかかる計算量は?• 追加する文字とすでに追加された文字の比較を、

Suffix link を辿った回数だけ行う• 1 文字と 1 文字の比較は O(1)• そのノードが存在するかの確認• map なら O(log σ)

rtr ertre

Page 47: Palindromic tree

計算量 (-1)

(0)

r t e

ee

• 新しい頂点を追加するのにかかる計算量は?• 追加する文字とすでに追加された文字の比較を、

Suffix link を辿った回数だけ行う• 1 文字と 1 文字の比較は O(1)• そのノードが存在するかの確認• map なら O(log σ)• 新しい頂点に Suffix link を追加するために、さらに

suffix link を辿る rtr ertre

Page 48: Palindromic tree

計算量 (-1)

(0)

r t e

ee

• 新しい頂点を追加するのにかかる計算量は?• 追加する文字とすでに追加された文字の比較を、

Suffix link を辿った回数だけ行う• 1 文字と 1 文字の比較は O(1)• そのノードが存在するかの確認• map なら O(log σ)• 新しい頂点に Suffix link を追加するために、さらに

suffix link を辿る• 新しい頂点の深さは最大で、( 前の頂点の深さ ) - ( 辿った回数 ) + 3

rtr ertre

Page 49: Palindromic tree

計算量 (-1)

(0)

r t e

ee

• 新しい頂点を追加するのにかかる計算量は?• 追加する文字とすでに追加された文字の比較を、

Suffix link を辿った回数だけ行う• 1 文字と 1 文字の比較は O(1)• そのノードが存在するかの確認• map なら O(log σ)• 新しい頂点に Suffix link を追加するために、さらに

suffix link を辿る• 新しい頂点の深さは最大で、( 前の頂点の深さ ) - ( 辿った回数 ) + 3

rtr ertre

N 回の操作後、深さは最大でも 3N 回しか増えない=> 合計の計算量は O(N) * O(log σ)

Page 50: Palindromic tree

Appendixhttps://arxiv.org/abs/1506.04862• EERTREE: An Efficient Data Structure for Processing Palindromes in Strings

• http://adilet.org/blog/25-09-14/ • Palindromic tree を解説したブログ