Right tree right place: vegetationmap4africa and Uganda Tree Finder
Palindromic tree
-
Upload
math -
Category
Technology
-
view
1.201 -
download
2
Transcript of Palindromic tree
Palindromic Tree@__MATH
Palindromic Tree(Eertree) とは•Mikhail Rubinchik さんが作ったデータ構造• 昔 codeforces にも参加されていた• 割と最近に発表された、 2015 年 ?
何ができるの?•文字列に含まれる全てのユニークな回文を求める• それぞれの出現回数も求められる• i 番目が最後尾となるような、異なる長さの回文を求める•構築がオンラインで出来る•空間 : O(nσ) (n は文字列の長さ、 σ は文字種 )• 入力がランダムな文字列の場合 expected O(√nσ) らしい•計算 : O(n)
何ができるの?•文字列に含まれる全てのユニークな回文を求める• それぞれの出現回数も求められる
S = “eertreere” の時“e” : 5 回 , ”r” : 3 回 , ”t” : 1 回“ee” : 2 回 , “rtr” : 1 回 , “ere” : 1 回“ertre” : 1 回 , “eertree” : 1 回
何ができるの?• i 番目が最後尾となるような、異なる長さの回文を求める
S = “eertreere” の時、 i = 5 が最後尾となるような回文は “ ertre”, ”e” の 2 個◦ 0-indexed
見た目• S = “eertreere” の時
見た目 (-1)(0)
r t e
eeere
reerertre
eertree
rtr
• S = “eertreere” の時
見た目 (-1)(0)
r t e
eeere
reerertre
eertree
rtr
• S = “eertreere” の時•見づらい•辺を減らして表示
見た目 (-1)(0)
r t e
eeere
reerertre
eertree
rtr
• S = “eertreere” の時
S に含まれている回文が頂点
見た目 (-1)(0)
r t e
eeere
reerertre
eertree
rtr
• S = “eertreere” の時
S に含まれている回文が頂点
長さが -1 の特殊な頂点長さが 0 の特殊な頂点
見た目 (-1)(0)
r t e
eeere
reerertre
eertree
rtr
• S = “eertreere” の時
見た目 (-1)(0)
r t e
eeere
reerertre
eertree
rtr
• S = “eertreere” の時一つ前の回文の両側に一文字足して出来る回文に辺を張る
見た目 (-1)(0)
r t e
eeere
reerertre
eertree
rtr
• S = “eertreere” の時一つ前の回文の両側に一文字足して出来る回文に辺を張る
長さが 1 の回文は長さが -1 の回文から作る
見た目 (-1)(0)
r t e
eeere
reerertre
eertree
rtr
• S = “eertreere” の時Suffix Link
見た目 (-1)(0)
r t e
eeere
reerertre
eertree
rtr
• S = “eertreere” の時
頂点の文字列に含まれる最大の回文接尾辞へ suffix link を張る
Suffix Link
接尾辞•文字列の接尾辞とは、(開始位置を異にし終端位置を元の文字列と同じくする部分文字列)• Wikipedia より• https://ja.wikipedia.org/wiki/接尾辞配列• S = “eertre” の時
eertre ertre rtre tre re e
見た目 (-1)(0)
r t e
eeere
reerertre
eertree
rtr
• S = “eertreere” の時
頂点の文字列に含まれる最大の回文接尾辞へ suffix link を張る
Suffix Link
長さが 1 の頂点からは、長さ 0 の頂点へ
見た目 (-1)(0)
r t e
eeere
reerertre
eertree
rtr
• S = “eertreere” の時
頂点の文字列に含まれる最大の回文接尾辞へ suffix link を張る
Suffix Link
長さが 1 の頂点からは、長さ 0 の頂点へ長さが 0 の頂点からは、長さ -1 の頂点へ
見た目 (-1)(0)
r t e
eeere
reerertre
eertree
rtr
• S = “eertreere” の時
完成Suffix Link
Palindromic Tree のデータ構造•木を 3 つ同時に作っていくデータ構造• 長さが偶数の頂点と、それらを結ぶ辺で構成される木• 長さが奇数の頂点と、それらを結ぶ辺で構成される木• 全ての頂点を suffix link で結んだ木 (-1)
(0)
r t e
eeere rtr
Suffix Link tree全ての頂点を suffix link で結んだ木◦ これが便利◦ 公式の呼び方はなさそう?
(-1)
(0)
r t e
ee erertr
作り方 (-1)(0)
r e
ee
• S = “eer” まで完成
作り方 (-1)(0)
r e
ee
• S = “eer” まで完成
“eer” の最長の回文接尾辞
作り方 (-1)(0)
r e
ee
• S = “eer” まで完成“eert” の頂点を作るS += “t”
作り方 (-1)(0)
r e
ee
• S = “eer” まで完成“eert” の Palindromic tree を作る• S += “t”• “t” + “r” + “t” は” eert” の回文接尾辞ではない
trt?
作り方 (-1)(0)
r e
ee
• S = “eer” まで完成“eert” の Palindromic tree を作る• S += “t”• “t” + “r” + “t” は” eert” の回文接尾辞ではない• Suffix link を辿り “ (0)” へ移動
作り方 (-1)(0)
r e
ee
• S = “eer” まで完成“eert” の Palindromic tree を作る• S += “t”• “t” + “r” + “t” は” eert” の回文接尾辞ではない• Suffix link を辿り “ (0)” へ移動• “t” + “” + “t” は” eert” の回文接尾辞ではない
tt?
作り方 (-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)” へ移動
作り方 (-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
作り方 (-1)(0)
r t e
ee
• S = “eertr” まで完成
rtr
作り方 (-1)(0)
r t e
ee
• S = “eertr” まで完成
rtr
“eertr” の最長の回文接尾辞
作り方 (-1)(0)
r t e
ee
• S = “eertr” まで完成“eertre” の Palindromic treeを作る• S += “e”
rtr
作り方 (-1)(0)
r t e
ee
• S = “eertr” まで完成“eertre” の頂点を作るS += “e”
“e” + “rtr” + “e” は “ eertre” の回文接尾辞 rtr
ertre?
作り方 (-1)(0)
r t e
ee
• S = “eertr” まで完成“eertre” の Palindromic treeを作る• S += “e”
“e” + “rtr” + “e” は “ eertre” の回文接尾辞 rtr
ertre“eertre” の最長の回文接尾辞
作り方 (-1)(0)
r t e
ee
• Suffix Link の追加• 元いた頂点 “ rtr” から、 suffix linkを辿って “ r” へ移動
rtr
ertre
作り方 (-1)(0)
r t e
ee
• Suffix Link の追加• 元いた頂点 “ rtr” から、 suffix linkを辿って “ r” へ移動• “ere” は “ ertre” の回文接尾辞ではない
rtr
ertre
ere
作り方 (-1)(0)
r t e
ee
• Suffix Link の追加• 元いた頂点 “ rtr” から、 suffix linkを辿って “ r” へ移動• “ere” は “ ertre” の回文接尾辞ではない• “r” から、 suffix link を辿って” (0)” へ 移動 rtr
ertre
作り方 (-1)(0)
r t e
ee
• Suffix Link の追加• 元いた頂点 “ rtr” から、 suffix linkを辿って “ r” へ移動• “ere” は “ ertre” の回文接尾辞ではない• “r” から、 suffix link を辿って” (0)” へ 移動• “ee” は” ertre” の回文接尾辞ではない rtr
ertre
作り方 (-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
作り方 (-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
何ができるの? ( 再掲 )•文字列に含まれる全てのユニークな回文を求める• それぞれの出現回数も求められる• i 番目が最後尾となるような、異なる長さの回文を求める
何ができるの?•文字列に含まれる全てのユニークな回文を求める• 頂点数 - 2 すればよい
(0),(-1) の頂点を除く必要あり (-1)(0)
r t
e
ee
erereer
ertre
eertree
rtr
何ができるの?•文字列に含まれる全てのユニークな回文を求める• 頂点数 - 2 すればよい•i 番目が最後尾となるような、異なる長さの回文を求める
何ができるの?•文字列に含まれる全てのユニークな回文を求める• 頂点数 - 2 すればよい• i 番目が最後尾となるような、異なる長さの回文を求める• Suffix link tree の深さと一致する• S = “eertreere” の時、 i = 5 が最後尾となるような回文は“ ertre”, ”e” の 2 個
(-1)(0)eertre
計算量 (-1)
(0)
r t e
ee
• 新しい頂点を追加するのにかかる計算量は?
rtr
計算量 (-1)
(0)
r t e
ee
• 新しい頂点を追加するのにかかる計算量は?• 追加する文字とすでに追加された文字の比較を、
Suffix link を辿った回数だけ行う• 1 文字と 1 文字の比較は O(1)• そのノードが存在するかの確認• map なら O(log σ)
rtr ertre
計算量 (-1)
(0)
r t e
ee
• 新しい頂点を追加するのにかかる計算量は?• 追加する文字とすでに追加された文字の比較を、
Suffix link を辿った回数だけ行う• 1 文字と 1 文字の比較は O(1)• そのノードが存在するかの確認• map なら O(log σ)• 新しい頂点に Suffix link を追加するために、さらに
suffix link を辿る rtr ertre
計算量 (-1)
(0)
r t e
ee
• 新しい頂点を追加するのにかかる計算量は?• 追加する文字とすでに追加された文字の比較を、
Suffix link を辿った回数だけ行う• 1 文字と 1 文字の比較は O(1)• そのノードが存在するかの確認• map なら O(log σ)• 新しい頂点に Suffix link を追加するために、さらに
suffix link を辿る• 新しい頂点の深さは最大で、( 前の頂点の深さ ) - ( 辿った回数 ) + 3
rtr ertre
計算量 (-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 σ)
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 を解説したブログ