Advanced Data Structures Lecture 5 発表者:後藤順一 目次 オイラー路木とは Dynamic connectivity 問題の概観 他の動的グラフ問題の概観 HLT 法 目次 オイラー路木とは Dynamic connectivity 問題の概観 他の動的グラフ問題の概観 HLT 法 オイラー路木 (Euler tour tree) (1) (木に対する)オイラー路:木の周りを一周する路 どの枝も2度ずつ通る オイラー路で訪れた順に平衡2分探索木(BST)に格納 各節点は最初と最後に訪れた所へのポインタを持つ ABCDCECB・・・・A 2分探索木に格納 ・・・ A D B J C B C F K A D E G H I L C E オイラー路木 (Euler tour tree) (2) 3つの基本操作 find root(v) :節点v の根を見つける cut(v) :節点v とその親の間の枝を削除 link(v, w) :根である節点v を、節点w の新しい子として追加 BST に対する操作を定数回ずつ使っている。 これらは Olg n の時間でできる Euler tour tree の find root(v) v が含まれる木の根を見つける BST の最小(or 最大)の節点を返せばよい a a・・・v・・・v・・・a v findroot a Euler tour tree の cut(v) 節点 v を親の節点から切り離す。 v の最初と最後に訪れた節点を切り離し、その前後を繋げる a a・・・v・・・v・・・a × cut v cut a・・・・・・a v・・・v Euler tour tree の link(v, w) 根である節点 v を、節点 w の新たな子とする w の木を、w を最後に訪れる前の部分で分け、「w の前」「w」 「v の木」「w以降」を繋げる。 a link v a・・・w・・・w・・・a v・・・v link w a・・・w・・・wv・・・vw・・・a Euler tour tree Euler tour tree では、各節点に定数領域の記憶を持た せることにより、自らの子サブツリーに対する演算を記憶 することができる。 演算:和、最小値、最大値、etc. cut , link の操作中に書き換える。 計算時間 Olg n を保ったまま。 後に紹介する HLT 法では、この性質を用いて拡張する。 目次 オイラー路木とは Dynamic connectivity 問題の概観 他の動的グラフ問題の概観 HLT 法 Dynamic Connectivity:問題の説明 無向グラフが繋がっているかどうかを判定する。 普通のグラフとの違い 記憶領域量や、挿入、削除時にかかる時間を多少犠牲にして、 検査にかかる時間を短くする。 2点(v, w) 間の問題 グラフ G 上の問題 Dynamic Connectivity:概観 (1) 次の上界や未解決問題がある。 埋め込み固定の平面に対して 更新、クエリともに Olg n [Eppstein et al. 92] OPEN: 一般のグラフに Olg n でできるか? Dynamic Connectivity:概観 (2) 一般のグラフに対するならし計算量 3 更新に Olg n(lg lg n) 、クエリに Olg n / lg lg lg n [Thorup 00] 更新に O lg n ,クエリに Olg n / lg lg n [Holm et al. 01] →HLT法 Ox lg n の更新には lg n / lg x のクエリが必要、 Ox lg n のクエリには lg n / lg x の更新が必要 2 [Patrascu et al. 04] ワーストケースの計算量 更新に O n 、クエリ O1[Eppstein et al. 97] Dynamic Connectivity:単純化 incremental :挿入のみ ならし計算量:O (n) 最悪計算量: n は逆アッカーマン関数 x の更新には lg n / lg xのクエリ計算量が必要 ( x 1) decremental : 削除のみ 更新に Om lg n n poly (lg n) 、クエリ計算量 O1 (m : 枝の数)[Thorup 99] 目次 オイラー路木とは Dynamic connectivity 問題の概観 他の動的グラフ問題の概観 HLT 法 他の dynamic graph problem (1) 最小全域木問題 • • • O(lg 4 n)の更新[Holm et al. 01] ワーストケースで O ( n ) の更新[Eppstein et al. 97] 埋め込み固定グラフで O (lg n) [Eppstein et al. 92] 二部性検査 • 最小全域木問題に還元できる 他の dynamic graph problem (2) 平面性検査 • O n 2 / 3 [Galil et al. 97] • • • 埋め込み固定 : O lg 2 n [Eppstein et al. 97] incremental : Om m, n n [la Poutre 94] OPEN: fixed minor に対する検査 他の dynamic graph problem (3) 2点間の k-連結性 k 2 に対して、 O poly lg n [Holm et al. 01] planar decremental で 3-枝連結 Olg 2 n [Giammaresi et al. 96] worst case: [Eppstein et al. 97] 2-枝連結: O n 2-点連結、3-点連結:On 3-枝連結: On 2 / 3 k=4: On (n) O1 枝連結:On lg n OPEN: か? k O1, poly (lg n) に対して O( poly (lg n)) でできる 他の dynamic graph problem (4) グラフ全体の k-連結性 O( poly (lg n)) -枝連結: O( n poly (lg n)) [Thorup 01] 最小カットは O( poly (lg n)) のサイズ OPEN: k O1, poly (lg n) に対して O( poly (lg n)) でできる か? 目次 オイラー路木とは Dynamic connectivity 問題の概観 他の動的グラフ問題の概観 HLT 法 HLT 法:概要 Dynamic connectivity に対するデータ構造。 [Holm, de Lichtenberg, Thorup 2001] グラフにできる操作は、枝の挿入、削除のみ。 節点の挿入・削除は考えない 初期状態では、グラフ中に枝がないものとする。 query: Olg n / lg lg n update: O lg 2 n HLT 法に入る前に グラフを扱うための準備。 オイラー路森に対して、 次のような操作も Olg n でできる。 木の根を変える:change root(v) 木の中の枝を削除:delete(e=(v, w)) v delete どちらが親か分からなくてもよい。 木を繋ぐ枝の挿入:insert(e=(v, w)) w 根でなくてもよい。 v w insert HLT 法:データ構造 アイデア 枝を lg n レベルの階層に分け、各レベル以下の枝からなる グラフのスパニング森をオイラー路木に格納する。 lg n 個のオイラー路森と、グラフの隣接リストを記憶する。 0 グラフ 1 lgn ・・・・・ ↓ スパニング森 ・・・・・ ↓ オイラー路森 ・・・・・ HLT 法:定義 各枝に対して、レベルを定義する。 Gi :レベルが i以下の枝からなるサブグラフ 枝をグラフに張ったときに lg n 、時間とともに減少。 i 2 Invariant 1: 繋がっている部品の節点数はどれも 以下 Fi : Giのスパニング森 Flg n が全体のグラフ G のスパニング森 Invariant 2: F0 F1 Flg n 、すなわち Fi Flg n Gi つまり Flg n は枝のレベルを重みとした最小スパニング森 (cf. Kruskal のアルゴリズム) HLT 法: クエリ計算量 問い合わせに速く答えるため、 Flg n のオイラー路森を収 める木を変える。 B 木(度数 Olg n ) lg n 深さ Olg n / lg lg n、枝の張り替えに O find root : Olg n / lg lg n ( 更新: Olg 2 n / lg lg n ) グラフの連結性を調べる には、2つの節点に対して find root を用いればよい。 オイラー路木 (Euler tour tree) (1)(再掲) (木に対する)オイラー路:木の周りを一周する路 どの枝も2度ずつ通る オイラー路で訪れた順に平衡2分探索木(BST)に格納 各節点は最初と最後に訪れた所へのポインタを持つ ABCDCECB・・・・A 2分探索木に格納 B木に格納 ・・・ A D B J C B C F K A D E G H I L C E HLT 法: insert の例 スパニング森に対する操作を見る。 insert(e=(A, B)) A と B は既に繋がっているため、ス パニング森に対しては何もしない。 隣接行列に記憶するのみ。 insert(e=(D, G)) D と G が繋がっていないため、スパ ニング森にも枝を張る。 レベルは最大のものを使う (lg n)。 Flg n のみに枝を追加する。 C B A 3 4 1 E D 2 4 3 H G F 4 I 2 J Flg n HLT 法: insert insert(e=(v, w)) 1. 2. 3. v と w が繋がっているか? e を v と w の隣接リストに追加する。 e のレベルを lg n とする。 Flg n で v と w が繋がっていなかったら e を Flg n に加える。 終。 それぞれに対して find root を用いれば良い。 find root: Olg n / lg lg n 枝の追加: Olg n Olg n v e w Flg n HLT 法: delete の例 (1) スパニング森に対する操作を見る。 delete(e=(A, B)) スパニング森に含まれていないため、 何もしない。 隣接行列から削除するのみ。 C B A 3 4 1 E D 2 4 3 H G F 4 I 2 J Flg n HLT 法: delete の例 (2) delete(e=(D, F)) スパニング森から枝を削除する。木 が2つに分けられる。 D の木と F の木は、レベル3 以上の 他の枝により繋がっている可能性が ある。 他の枝があれば、それによってスパ ニング森を再構築する。 HLT 法の delete 中では、代わりの枝 を探すときに、さらに別の作業も行う。 C B A 3 4 1 E D 4 3 2 4 (3) H G F 4 I 2 J Flg n HLT 法: delete (1) 全体 delete(e=(v, w)) 1. 2. e を v と w の隣接リストから削除する。 e が Flg n にあるなら、 e を Flevel ( e ) , , Flg n から削除。 v と w を繋げる代わりの枝を探す。 終。 代わりの枝のレベルは消される枝 e のレベル以上。 あり得る中でレベルが最小のものを探す。 Invariant 2 (最小スパニング木)を保守するため HLT 法: delete (2) 枝探し 枝探しは次のように行う。 for i=level(e), … , lg n Tv を Fi 中で v を含む木とする。 Tv Tw となるように v と w を入れ替える。(⇒拡張1) x が Tv にある、レベルが i の枝 (x, y) に対して (⇒拡張2) if y が Tw に含まれていれば (x, y) を Fi , , Flg n に加えて終了。 else 枝(x, y) のレベルを i -1 にする。(charge) 枝探しと同時に、 v 側の枝 のレベルを下げている。 v w HLT 法: delete (2) 枝探し・レベル下げ Invariant 1: Gi で繋がっている部品の節点数はどれも 枝のレベルを下げて良いのか? 2i 以下 i と の節点の和は 以下 2 Tv Tw i 1 Tv Tw より、T の節点数は 2 以下 v したがって、 Tv と Tw が繋がっていない場合、 Tv 中の枝の最大レベルは i-1 で良い。 v w HLT 法: delete (3) オイラー路木の拡張 オイラー路森の各節点の記憶領域を拡張する。 拡張1:サブツリーのサイズ Tv と Tw の節点数を O1 で比較する。 拡張2:サブツリーがレベルi の枝と繋がっている節 点を含んでいるか (true/false) Tv 中の節点 x に繋がっている、次のレベル i の枝を Olg n で探すことができる。 HLT 法: delete (4) 計算量 最初に枝の削除をするのに O lg 2 n 1つの枝削除に Olg n 、それを lg n 回以下 2 O lg n 枝探しに 次の枝を探すのに Olg n 、それを charge の回数だけ繰り返す。 各枝が charge されるのは lg n 回以下 代わりの枝がある場合、枝の追加に O lg 2 n 2 O lg n したがって、全体でも
© Copyright 2024 ExpyDoc