簡潔データ構造 国立情報学研究所 定兼 邦彦.

Slides:



Advertisements
Similar presentations
組合せ最適化輪講 2.3 連結性 川原 純. 2.3 連結性 内容 – グラフ上の節点をすべてたどるアルゴリズム 計算機上でのグラフの表現 – 強連結成分を求めるアルゴリズム トポロジカル順序を求める方法も – k- 連結、 k- 辺連結について – 2- 連結グラフの耳分解について.
Advertisements

A Simple Constant Time Enumeration Algorithm for Free Trees 中野 眞一 宇野 毅明 群馬大学 情報学研究所 2003 年 9 月 19 日 アルゴリズム研究会.
簡潔データ構造 国立情報学研究所 定兼 邦彦.
Succinct Data Structure
透過的データ圧縮 Transparent Data Compression
区間グラフにおける区間表現からMPQ-treeを効率よく構成するアルゴリズム
簡潔データ構造 国立情報学研究所 定兼 邦彦.
2 分探索木 Binary Search Tree 実行可能な操作 計算量 木の高さは,最悪 O(n) n = |A| : 要素の個数
情報生命科学特別講義III (8)木構造の比較: 順序木
アルゴリズムとデータ構造 2013年6月18日
アルゴリズムとデータ構造 2010年7月5日
算法数理工学 第9回 定兼 邦彦.
第11回 整列 ~ バケットソート,基数ソート,ヒープソート~
On the Enumeration of Colored Trees
Problem G : Entangled Tree
簡潔データ構造 国立情報学研究所 定兼 邦彦.
An Algorithm for Enumerating Maximal Matchings of a Graph
集中講義(九州大学数理学研究院) バイオ構造データに対する数理モデルと アルゴリズム(3) + 数理談話会 木構造および画像データの文法圧縮
阿久津 達也 京都大学 化学研究所 バイオインフォマティクスセンター
JAG Regional Practice Contest 2012 問題C: Median Tree
アルゴリズムとデータ構造 2012年6月14日
データ構造とアルゴリズム 第7回 木 ~ データ構造(3)~.
情報工学概論 (アルゴリズムとデータ構造)
C11: 大量データ処理のための領域効率の良いアルゴリズム
東京大学大学院情報理工学系研究科 数理情報学専攻 定兼 邦彦 2016年4月7日
宇野 毅明 国立情報学研究所 2002年3月 東北大大学院 情報科学研究科ワークショップ
データ構造とアルゴリズム 第6回の2 木 ~ データ構造(3)~.
第11講: 平成18年12月 8日 (金) 4限 E352教室 グラフ (1).
東京大学 大学院情報理工学系研究科数理情報学専攻 工学部計数工学科 定兼 邦彦 2014年8月6日
ヒープソートの復習.
集中講義(九州大学数理学研究院) バイオ構造データに対する数理モデルと アルゴリズム(5) 木構造データ間の編集距離
アルゴリズムとデータ構造 2011年6月14日
情報生命科学特別講義III (7)進化系統樹推定
アルゴリズムとデータ構造 第7回探索のためのデータ構造(1) 2015/11/18 アルゴリズムとデータ構造 2015.
二分探索木によるサーチ.
大規模キー集合の 効率的な格納手法 tx bep
7-3.高度な木 (平衡木) AVL木 平衡2分木。回転操作に基づくバランス回復機構により平衡を保つ。 B木
2009/10/16 いろいろなデータ構造 第3講: 平成21年10月16日 (金) 4限 E252教室 コンピュータアルゴリズム.
k 個のミスマッチを許した点集合マッチング・アルゴリズム
第25章 単一始点最短路 3節 Bellman-Fordのアルゴリズム
情報生命科学特別講義III (2)文字列データ構造
決定木とランダムフォレスト 和田 俊和.
定兼邦彦 今井浩 東京大学理学系研究科 情報科学専攻
簡潔データ構造 国立情報学研究所 定兼 邦彦.
アルゴリズムとデータ構造1 2006年7月4日
二分木のメソッド(続き).
数理情報工学演習第二B 数理2研 定兼 邦彦 2016/9/30.
データ構造とアルゴリズム (第3回) ー木構造ー.
第9回 優先度つき待ち行列,ヒープ,二分探索木
25. Randomized Algorithms
データ構造と アルゴリズム 第七回 知能情報学部 新田直也.
データ構造と アルゴリズム 第六回 知能情報学部 新田直也.
A Simple Algorithm for Generating Unordered Rooted Trees
離散数学 07. 木 五島.
Cプログラミング演習 第10回 二分探索木.
プログラミング 4 木構造とヒープ.
生物情報ソフトウェア特論 (2)たたみ込みとハッシュに 基づくマッチング
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分
第16章 動的計画法 アルゴリズムイントロダクション.
第9回 優先度つき待ち行列,ヒープ,二分探索木
ヒープソートの復習 第12回.
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造 第2章 リスト構造 5月24日分
4.プッシュダウンオートマトンと 文脈自由文法の等価性
ヒープソート.
ヒープソート.
情報生命科学特別講義III (3)たたみ込みとハッシュに 基づくマッチング
グラフの列挙 中野 眞一    (群馬大学) 2019/9/14 列挙学校.
7.木構造 7-1.データ構造としての木 7-2.2分探索木 7-3.高度な木.
グラフの帯域幅連続多重彩色 を求めるアルゴリズム (Bandwidth Consective Multicolorings of Graphs) 西関研究室 西川和秀.
Presentation transcript:

簡潔データ構造 国立情報学研究所 定兼 邦彦

目次 0. 基礎 1. ビットベクトル 2. 木構造1 3. 木構造2 4. 接尾辞配列 5. 接尾辞木 6. 動的なデータ構造 7. 配列

2. 木構造の簡潔データ構造 根付き木のみ扱う 順序木/非順序木 枝にラベルがある/ない 子ノード間に順序がある/ない 非順序木では,子を並び替えて同じになる木は 同一の木とみなす 枝にラベルがある/ない ノードのラベルは,その親への枝のラベルで代用

順序木とは ordered tree / ordinal tree 根付き木 子に順序がついている ラベルなし 枝ラベル→cardinal tree 2 6 8 1 7 3 5 4

順序木の簡潔表現 LOUDS (level order unary degree sequence) BP (balanced parentheses) DFUDS (depth first unary degree sequence)

LOUDS表現 [1,2] 10110111011000000 節点の次数を幅優先順に1進数で符号化 次数 d → 1d0 n 節点で 2n+1 bits (下限に一致) i 番目の節点は i 番目の 1 で表す 2 3 8 1 7 4 6 5 L 10110111011000000 1 2 3 4 5 6 7 8 LOUDS

木の巡回操作 (1) 10110111011000000 i 番目のノード: select1(L, i) (i  1) firstchild(x) y := select0(rank1(L,x))+1 if L[y] = 0 then 1 else y lastchild(x) y := select0(rank1(L,x)+1)1 2 3 8 1 7 4 6 5 1 2 3 4 5 6 7 8 LOUDS L 10110111011000000

木の巡回操作 (2) sibling(x) if L[x+1] = 0 then 1 else x+1 parent(x) = select1(rank0(L,x)) degree(x) = lastchild(x)  firstchild(x) + 1 長所: rank/selectだけで求まる 短所: 部分木のサイズが求まらない 2 3 8 1 7 4 6 5 1 2 3 4 5 6 7 8 LOUDS L 10110111011000000

BP表現 [3] ((()()())(()())) 各節点を対応する括弧のペアで表現 n 節点で 2n bits サイズの下限と一致 P 6 8 1 7 3 5 4 P ((()()())(()())) BP

BPでの基本操作 ノードは( の位置で表す findclose(P,i): P[i] の( と対応する )の位置を返す enclose(P,i): P[i] の( を囲む括弧の位置を返す enclose findclose 1 1 2 3 4 5 6 7 8 9 10 11 2 3 11 8 P (()((()())())(()())()) 4 7 9 10 5 6

木の巡回操作 parent(v) = enclose(P,v) firstchild(v) = v + 1 sibling(v) = findclose(P,v) + 1 lastchild(v) = findopen(P, findclose(P,v)1) 1 enclose findclose 2 3 8 11 1 2 3 4 5 6 7 8 9 10 11 4 (()((()())())(()())()) 7 9 10 5 6

子孫の数 (部分木の大きさ) v を根とする部分木の大きさは subtreesize(v) = (findclose(P,v)v+1)/2 degree (子の数) は findclose の繰り返しで求まるが 子の数に比例する時間がかかる 1 2 3 11 1 2 3 4 5 6 7 8 9 10 11 8 P (()((()())())(()())()) 4 7 9 10 5 6

findcloseのデータ構造 [4] 括弧列を長さ B = ½ log n のブロックに分割 b(p): p のブロックの番号 (p): p とマッチする括弧の位置 括弧 p が far ⇔ b(p)  b((p)) far 開括弧 p が opening pioneer ⇔ p の直前の far 開括弧 q に対し b((p))  b((q)) opening pioneerと対応する括弧の位置を0,1ベクトルで表現 ( ( ) ) ) p (p) (q) q r ( (r)

補題: ブロックの数を  とすると,opening pioneerの数は 23 以下. 証明: 各ブロックをノード,(b(p), b((p)) を枝とするグラフは外平面グラフ opening/closing pioneerは再びBPになる  = n/B = 2n/log n ⇒ BPの長さは O(n/log n)

再帰構造の表現 opening pioneerと対応する括弧の位置を 0,1ベクトル B で表現 B は長さ 2n, 1の数 O(n/log n) の疎なベクトル O(n log log n/log n) bits で表現できる ( ( ) ) ) p (p) (q) q r ( (r) P B 0100 0101 0000 0000 0010 1001 P1 ((()))

n 節点の木のBP表現のサイズを S(n) とすると S(n) = 2n + O(n log log n/log n) + S(O(n/log n)) 節点数が O(n/log2 n) になったら,答えを全部 格納しても O(n/log n) bits よって S(n) = 2n + O(n log log n/log n)

findcloseのアルゴリズム (p) = findclose(P,p) を求めるとき p が far でないなら (p) はテーブルから求まる p の直前の pioneer p* を求める pioneer の括弧列を用いて(p*) を求める p が pioneer でないなら, b((p))  b((p*)) p と p* の深さの差から,(p) の位置が決まる p* p (p) (p*) ( ( ) )

enclose (p) = enclose(P,p) とする b((p)) = b(p) ならば (p) は表引きで求まる 対応する括弧の位置も記憶 括弧が複数ある場合は一番外側だけ記憶 括弧を抜き出して再帰 ( ( (()))( ) ) )

BPでの基本操作2 rankp(P,i): P[1..i] 中のパタン p の数を返す selectp(P,i): P 中の i 番目の p の位置を返す p の長さが定数なら,rank/selectは定数時間 1 1 2 3 4 5 6 7 8 9 10 11 2 3 11 8 P (()((()())())(()())()) 4 7 9 10 rank()(P,10) = 3 5 6

葉に関する操作 [5] 葉はBP中の () で表される i 番目の葉の位置 = select()(P, i) 部分木中の葉の数,部分木中の最左葉,最右葉 も求まる 1 1 2 3 4 5 6 7 8 9 10 11 2 3 11 8 P (()((()())())(()())()) 4 7 3 を根とする部分木 9 10 5 6

ノードの深さ 超過配列 E[i] = rank((P,i)  rank)(P,i) とすると depth(v) = E[v] E は格納せず P と rank 計算用索引を格納 (()((()())())(()())()) 1212343432321232321210 P E 2 1 3 8 4 5 6 7 9 10 11

最近共通祖先 (lca) の計算 lca = lowest common ancestor u = lca(v,w): v と w の共通の祖先で最も根から遠いもの 定数時間で計算可 v w u

m = RMQE(v,w): E[v..w] 中の最小値の添字 (RMQ = Range Minimum Query) u = parent(RMQE(v,w)+1) E は超過配列. ノードの深さを表す m = RMQE(v,w): E[v..w] 中の最小値の添字 (RMQ = Range Minimum Query) u 146 3 5 2 7 1 4 6 w 1 7 3 2 1 3 5 5 2 4 6 v P (()((()())())(()())()) 1212343432321232321210 E u v m w

DFUDS表現 [6] ((()((())))(())) ノードの次数を深さ優先順に1進数で符号化 次数 d ⇒ d 個の ( と 1つの ) 先頭に(をつける 2n ビット 1 2 6 3 4 5 7 8 DFUDS U ((()((())))(())) 1 2 3 4 5 6 7 8

補題: n ノードの順序木のDFUDSは長さ 2n のバランス した括弧列になる p 個の木に対するDFUDSを U1, U2,..., Up とする (ノード数が合計 n1, DFUDSの長さの合計 2n2) ルートがこれらの木を子に持つような木を考える. その木に対するDFUDS U は となる. Ui の先頭のダミー 括弧を除いたもの ルートの次数 p 先頭のダミー括弧

帰納法の仮定より,Ui はバランスしている. 先頭の括弧を取り除くため,( が1つ足りない. Uの先頭のダミー括弧と,ルートに対応する括弧列 ((p) では ( が p 個余っている. よって U はバランスしている. ノード数は n,括弧列の長さは 2n となり成り立つ. Ui の先頭のダミー 括弧を除いたもの ルートの次数 p 先頭のダミー括弧

DFUDSでの各種操作 ノード (次数d) は,その括弧列 (d) の先頭位置で表現 次数: 括弧列での位置 v とノードの preorder i の変換は 次数:

i-th child v U1 U2 U3 (((()(())))((()))) v 1 2 6 5 3 4 7 8 9

Parent p 2 5 6 (((()(())))((()))) p 1 2 6 5 3 4 7 8 9

子孫の数 (部分木の大きさ) v を根とする部分木の大きさは subtreesize(v) = (findclose(enclose(v))v)/2+1 p 2 5 6 (((()(())))((()))) p 1 2 6 5 3 4 7 8 9

DFUDS上でのLCA [7] 1232345432123210 ((()((())))(())) ((()()())(()())) BP上とほぼ同じ演算でlcaを計算可 lca(x,y) = parent(RMQE(x,y1)+1) 最小値は最左のものを使う 1 2 6 3 4 5 7 8 E 1232345432123210 DFUDS U ((()((())))(())) 1 2 3 4 5 6 7 8 BP P ((()()())(()())) E 1232323212323210

E[i] = rank((U,i)  rank)(U,i) とする. v の子の部分木を T1, T2,...,Tk, v のDFUDSを U[l0..r0], E[r0] = d, Ti のDFUDSを U[li..ri] とする. 命題: E[ri] = E[ri-1]1 = di (1  i  k) E[j] > E[ri] (li  j < ri) v r0 r1 r2 r3 (((()(())))((()))) 123434543212343210 U E v 1 d 2 6 5 3 4 7 8 9

証明: 各部分木のDFUDS U[li..ri] は先頭に ( をつけるとバランスする ⇒ E[ri] = E[ri-1]1 = di E[j] > E[ri] (li  j < ri) v r0 r1 r2 r3 (((()(())))((()))) 123434543212343210 U E v 1 d 2 6 5 3 4 7 8 9

補題: lca(x,y) = parent(RMQE(x,y1)+1) 証明: v = lca(x,y) とする.v の部分木 T1, T2,...,Tk で x, y を含むものを T, T とする. E[r] = d とする. Case 1: y < r (y がT の最右葉ではないとき) E[y]  d+1, E[y1]  d+2 より RMQE(x,y1) = r1 T T E d+1 d d1 > d+1

E[y1] = d+1 より, RMQE(x,y1) は r1 と y1 で 最小値 d+1 をとる. Case 2: y = r のとき E[y1] = d+1 より, RMQE(x,y1) は r1 と y1 で 最小値 d+1 をとる. RMQでは最左のものをとるので r1 が求まる. いずれの場合も RMQE(x,y1)+1 = l となり, parent(l) = lca(x,y) となる.

その他の演算1 leaf-rank(v) = rank))(v) leaf-select(i) = select))(i) preorder-rank(v) = (rank)(v1))+1 preorder-select(i) = (select)(i1))+1 (((()(())))((()))) 123434543212343210 U E 1 2 3 4 5 6 7 8 9 6 2 4 1 3 7 9 8 5

その他の演算2 inorder-rank(v) = leaf-rank(child(v,2)1) inorder-select(i) = parent(leaf-select(i)+1) leftmost-leaf(v) = leaf-select(leaf-rank(v1)+1) rightmost-leaf(v) = findclose(enclose(v)) 1 2 3 4 5 6 7 8 9 (((()(())))((()))) 123434543212343210 U E 1 2 6 5 3 4 7 8 9

DFUDSの圧縮 [7] LOUDS, BP, DFUDS 表現は n ノードの順序木を 常に 2n bits で表現でき,下限と一致している しかし,順序木がある制約を満たすときは 2n より 少ないビット数で表現可能 例: 全ての内部ノードの次数が 2 であるような木は n bits で表現可能 サイズの下限は何か 2 5 7 1 6 3 4 1 1100100 2 3 4 5 6 7

サイズの(1つの)下限 次数 i のノード数が ni である順序木の数は サイズの下限 定義: 木次数エントロピー 目標: 順序木を nH*(T) bits に圧縮し,各種操作 を O(1) 時間で実現

定理 長さ n の文字列(アルファベットサイズ)   ⇒ ビット   任意箇所の log n ビットを定数時間で復元 DFUDS列 U をこの方法で圧縮すると,U の ビット列のエントロピーまで圧縮できる ただし,それは木次数エントロピーは関係ない

新しい表現 ((()((())))(())) S: 次数列 (c.f. DFUDSでは1進数で表現) S を圧縮して格納し,そこから U を復元 U の任意位置の log n bitsを定数時間で復元できれば, 既存の索引がそのまま使える  = n なので,そのままだと圧縮できない ⇒S を次数が log n 以上とそれ以外に分割 S 2 3 0 0 0 2 0 0 1 U ((()((())))(())) 2 3 4 5 6 7 8 DFUDS New

大きい次数の圧縮 ((((((((()((())))(((((((((())) DFUDSでの符号の開始・終了位置を保存 次数が log n 以上の頂点は n/log n 個以下 ⇒ O(n log log n/log n) ビットで表現できる 9 3 10 ((((((((()((())))(((((((((()))

小さい次数の圧縮  = log n ⇒ nH0(S) = nH*(T) 2つの列を併合するのは簡単

まとめ: 括弧列で行える木の操作 判定操作 順序操作 巡回操作 サイズに関する操作 葉かどうか,先祖/子孫関係 前行順/後行順/中央順で i 番目の節点/葉 巡回操作 親,長男,次の弟,i 番目の弟, d 代上の祖先 最近共通祖先,深さ最大節点 サイズに関する操作 深さ,部分木サイズ,次数 (子の数),部分木の葉数

参考文献 [1] G. Jacobson. Space-efficient Static Trees and Graphs. In Proc. IEEE FOCS, pages 549–554, 1989. [2] O'Neil Delpratt, Naila Rahman, Rajeev Raman: Engineering the LOUDS Succinct Tree Representation. WEA 2006: 134-145. [3] J. I. Munro and V. Raman. Succinct Representation of Balanced Parentheses and Static Trees. SIAM Journal on Computing, 31(3):762–776, 2001. [4] R. F. Geary, N. Rahman, R. Raman, and V. Raman. A simple optimal representation for balanced parentheses. Theoretical Computer Science, 368:231–246, December 2006. [5] J. Ian Munro, Venkatesh Raman, and S. Srinivasa Rao. Space efficient suffix trees. Journal of Algorithms, 39:205–222, 2001. [6] D. Benoit, E. D. Demaine, J. I. Munro, R. Raman, V. Raman, and S. S. Rao. Representing Trees of Higher Degree. Algorithmica, 43(4):275–292, 2005.

[7] J. Jansson, K. Sadakane, and W. -K. Sung [7] J. Jansson, K. Sadakane, and W.-K. Sung. Ultra-succinct Representation of Ordered Trees. In Proc. ACM-SIAM SODA, pages 575–584, 2007. [8] A. Farzan and J. I. Munro. A Uniform Approach Towards Succinct Representation of Trees. In Proc. SWAT, LNCS 5124, pages 173–184, 2008. [9] A. Farzan, R. Raman, and S. S. Rao. Universal Succinct Representations of Trees? In Proc. ICALP, LNCS 5555, pages 451–462, 2009. [10] P. Ferragina, F. Luccio, G. Manzini, and S. Muthukrishnan. Compressing and indexing labeled trees, with applications. Journal of the ACM, 57(1):4:1–4:33, 2009. [11] R. F. Geary, R. Raman, and V. Raman. Succinct ordinal trees with levelancestor queries. ACM Trans. Algorithms, 2:510–534, 2006. [12] H.-I. Lu and C.-C. Yeh. Balanced parentheses strike back. ACM Transactions on Algorithms (TALG), 4(3):No. 28, 2008.