Download presentation
Presentation is loading. Please wait.
1
最下位共通先祖問題と MF 木 ** ここで理解すべき内容 ** 抽象データ型 データ構造 計算量評価方法
** ここで理解すべき内容 ** 抽象データ型 Merge-Find 集合 (Union-Find 集合) データ構造 Merge-Find 木 (Merge-Find tree) 計算量評価方法 均し計算量 (amortized complexity)
2
例として考える問題 オフライン 最下位共通先祖 問題
3
オフライン最下位共通先祖問題 Off-line Lowest Common Ancestors Problem 入力: 出力:
入力: 根付き木 T = (V,E) 点対の集合 P = { p=(v,w) | v, w は T の点 } 出力: 各点対 p=(v,w)∈P に対する (木 T 上での)最下位共通先祖 anc(p)
4
最下位共通先祖 木 T 上の質問点対 p=(v,w) に対する 最下位共通先祖 anc(p) = a
木 T の点 a で,以下の性質を持つもの v と w の共通の先祖であり, a の真の子孫には v と w の共通の先祖が無い
5
オフライン最下位共通先祖問題 質問点対の集合 P P = { (c,h), (e,f), (f,g), (g,h) } 最下位共通先祖
木 T b d c e 最下位共通先祖 anc( (c,h) ) = b anc( (e,f) ) = e anc( (f,g) ) = b anc( (g,h) ) = d f a h g
6
オフライン(off-line)問題 オフライン(off-line)問題 オンライン(on-line)問題 全ての質問を予め知った上で
各質問に対する答えを求めるもの オンライン(on-line)問題 全質問を予め知ることができず, 質問毎に答えを出すもの
7
オフライン最下位共通先祖問題に対するアルゴリズム
8
アルゴリズム r v c c' 木 T を深さ優先探索(DFS)して求める. void DFS( v, T ) { 行きがけの処理 ;
行きがけの処理 ; c := lm_child(v) ; /* c を v の長男に */ while ( 子 c が存在する ) { DFS( c, T ) ; 子 c の情報を利用する処理 ; c := r_sibling( c ) ; /* c を次弟に */ } 帰りがけの処理 ; } /* end DFS */ 帰りがけに,最下位共通先祖が求められる ? r v c c'
9
点 v からの帰りがけ時の検査 (v,w)∈P なる質問点対が存在し w は既に探索済みか? もし,そうならば,
もし,そうならば, w の先祖で探索中の点の内, 最下位にある点 a は, v と w の最下位共通先祖 anc( (v,w) ) b d a e w v
10
必要な操作 1. 点 v を含む質問点対 (v,w) ∈P が存在するか否かの検査 2. もう一方の点 w は既に探索済みか否かの検査
これらを効率良く実行したい b d a e w v
11
必要な操作 1 点 v を含む質問点対 (v,w)∈P が存在するか否かの検査に対しては, 木 T の各点 v に対して,
v を含む質問点対 p=(v,w) ∈ P の集合 P(v) = { p | p=(v,w)∈ P } を覚えておく w w' v
12
必要な操作 2 b 点 v を含む質問点対 (v,w)∈P のもう一方の点 w が, 既に探索済みか否かの検査は d 点に a e w v
未探索 探索中 探索済み の印を付けておけば良い d a e w v
13
必要な操作 3 b d a e w v 点 w の探索中の先祖で, 最下位のもの a を求めるには, “探索中” の各点 a に対して,
集合 U(a) = { a } { w, ・・・ } w は a の子孫で探策済み, w の先祖で a より下に探索中の点は無い を覚える w ∈U(a) と現在探索中の点 v との 最下位共通先祖は a = anc( (v,w) ) U(a) の初期値は, U(a) = { a } とする d a e w v
14
アルゴリズムの例 集合 U(・) に対する操作
15
木 T と集合 U(・) および P(・) 木 T b d c e f a h g A = U(a) = { a }
B = U(b) = { b } C = U(c) = { c } D = U(d) = { d } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
16
木 T の深さ優先探索 木 T b d c e f a h g A = U(a) = { a } B = U(b) = { b } 探索中
C = U(c) = { c } D = U(d) = { d } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T 探索中 b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
17
木 T の深さ優先探索 木 T b d c e f a h g A = U(a) = { a } B = U(b) = { b }
C = U(c) = { c } D = U(d) = { d } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T 探索中 b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
18
木 T の深さ優先探索 木 T b d c e f a h g A = U(a) = { a } B = U(b) = { b }
C = U(c) = { c } D = U(d) = { d } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
19
木 T の深さ優先探索 木 T b d c e f a h g A = U(a) = { a } B = U(b) = { b }
C = U(c) = { c } D = U(d) = { d } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
20
点 g の探索終了: P(g) の検査 木 T b d c e f a h g A = U(a) = { a }
B = U(b) = { b } C = U(c) = { c } D = U(d) = { d } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g f, h は未探索 ⇒ 何もしない 探索済
21
点 g から戻る: A と G の併合 木 T b d c e f a h g A = U(a) = { a }
B = U(b) = { b } C = U(c) = { c } D = U(d) = { d } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T A = U(a) = { a, g } b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
22
点 a に戻った 木 T b d c e f a h g A = U(a) = { a, g } B = U(b) = { b }
C = U(c) = { c } D = U(d) = { d } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
23
点 a の探索終了: P(a) は空 木 T b d c e f a h g A = U(a) = { a, g }
B = U(b) = { b } C = U(c) = { c } D = U(d) = { d } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
24
点 a から戻る : A と D を併合 木 T b d c e f a h g A = U(a) = { a, g }
B = U(b) = { b } C = U(c) = { c } D = U(d) = { d } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T D = U(d) = { a, d, g } b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
25
点 d に戻った 木 T b d c e f a h g A = U(a) = { a, g } B = U(b) = { b }
C = U(c) = { c } D = U(d) = { a, d, g } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
26
点 h を深さ優先探索 木 T b d c e f a h g A = U(a) = { a, g } B = U(b) = { b }
C = U(c) = { c } D = U(d) = { a, d, g } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
27
点 h の探索終了: P(h) の検査 木 T b d c e f a h g A = U(a) = { a, g }
B = U(b) = { b } C = U(c) = { c } D = U(d) = { a, d, g } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g g は探索済み ⇒ anc((g,h)) は?
28
点 g を含む集合 U(・) の探索 木 T b d c e f a h g A = U(a) = { a, g }
B = U(b) = { b } C = U(c) = { c } D = U(d) = { a, d, g } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g g ∈ U(d) ⇒ anc((g,h)) = d
29
点 h から戻る : H と D を併合 木 T b d c e f a h g A = U(a) = { a, g }
B = U(b) = { b } C = U(c) = { c } D = U(d) = { a, d, g } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T D = U(d) = { a, d, g, h } b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
30
点 d に戻った 木 T b d c e f a h g A = U(a) = { a, g } B = U(b) = { b }
C = U(c) = { c } D = U(d) = { a, d, g, h } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
31
点 d から戻る 木 T b d c e f a h g A = U(a) = { a, g } B = U(b) = { b }
C = U(c) = { c } D = U(d) = { a, d, g, h } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g P(d) は空 ⇒ B と D を併合
32
点 b に戻った 木 T b d c e f a h g A = U(a) = { a, g }
B = U(b) = { a, b, d, g, h } C = U(c) = { c } D = U(d) = { a, d, g, h } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
33
点 c を深さ優先探索 木 T b d c e f a h g A = U(a) = { a, g }
B = U(b) = { a, b, d, g, h } C = U(c) = { c } D = U(d) = { a, d, g, h } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
34
点 c の探索終了: P(c) の検査 木 T b d c e f a h g A = U(a) = { a, g }
B = U(b) = { a, b, d, g, h } C = U(c) = { c } D = U(d) = { a, d, g, h } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T h を含む U(・) は? ⇒ anc((c,h)) = b b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g h は探索済み ⇒ anc((c,h)) は?
35
点 c から戻る : C と B を併合 木 T b d c e f a h g A = U(a) = { a, g }
B = U(b) = { a, b, d, g, h } C = U(c) = { c } D = U(d) = { a, d, g, h } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
36
点 b に戻った 木 T b d c e f a h g A = U(a) = { a, g }
B = U(b) = { a, b, c, d, g, h } C = U(c) = { c } D = U(d) = { a, d, g, h } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
37
点 e, f へ深さ優先探索 木 T b d c e f a h g A = U(a) = { a, g }
B = U(b) = { a, b, c, d, g, h } C = U(c) = { c } D = U(d) = { a, d, g, h } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
38
点 f の探索終了 : P(f) の検査 木 T b d c e f a h g A = U(a) = { a, g }
B = U(b) = { a, b, c, d, g, h } C = U(c) = { c } D = U(d) = { a, d, g, h } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T g を含む U(・) は? ⇒ anc((f,g)) = b b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g g は探索済み ⇒ anc((f,g)) は?
39
点 f から戻る : F と E の併合 木 T b d c e f a h g A = U(a) = { a, g }
B = U(b) = { a, b, c, d, g, h } C = U(c) = { c } D = U(d) = { a, d, g, h } E = U(e) = { e } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
40
点 e に戻った 木 T b d c e f a h g A = U(a) = { a, g }
B = U(b) = { a, b, c, d, g, h } C = U(c) = { c } D = U(d) = { a, d, g, h } E = U(e) = { e, f } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
41
点 e の探索終了 木 T b d c e f a h g A = U(a) = { a, g } f を含む U(・) は?
B = U(b) = { a, b, c, d, g, h } C = U(c) = { c } D = U(d) = { a, d, g, h } E = U(e) = { e, f } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T f を含む U(・) は? ⇒ anc((e,f)) = e b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g f は探索済み ⇒ anc((e,f)) は?
42
点 e から戻る : E と B の併合 木 T b d c e f a h g A = U(a) = { a, g }
B = U(b) = { a, b, c, d, g, h } C = U(c) = { c } D = U(d) = { a, d, g, h } E = U(e) = { e, f } F = U(f) = { f } G = U(g) = { g } H = U(h) = { h } 木 T b d c e f a h P(c) = { (c,h) } P(e) = { (e,f) } P(f) = { (e,f), (f,g) } P(g) = { (f,g), (g,h) } P(h) = { (c,h), (g,h) } g
43
根 b に戻り 全探索終了 木 T b b d c e f a h g
B = U(b) = { a, b, c, d, e, f, g, h } b b d c e f a h 全探索終了 g
44
アルゴリズムの記述と 計算量 深さ優先探索の再帰的記述
45
アルゴリズムの概要 void DFS( v, T ) /* 再帰的関数 */ 入力: v : NODE(値呼び) T : 木
P(v) : v を含む質問点対の集合 出力: anc(p) : 各質問点対 p に対する 最下位共通先祖 NODE c /* 局所変数 */ 各点 v に対して,未探索の印しを付けておき, 集合 U(v) の初期化 U(v) = { v } を行って, 関数 DFS( 木 T の根,T ) を呼ぶ.
46
アルゴリズムの概要 実は不要 Merge( ) Find( ) void DFS( v, T ) { v に探索中の印を付ける ;
c := lm_child(v) ; while ( 子 c が存在する ) { DFS( c, T ) ; U(c) を U(v) に併合する ; c := r_sibling( c ) ; } for ( 各 p=(v,w)∈P(v) ) { if ( 点 w は探索済み ) { 点 w を含む U(a) を求める ; } } v に探索済みの印を付ける ; } /* end DFS */ 実は不要 Merge( ) Find( )
47
集合 U(・) に対する操作 指定された点 w を含む集合 U(a) を見出す Find( w ) 計算量を O(TF) と書く
点 a は点 v と w の最下位共通先祖 集合 U(v) と U(c) を併合し,U(v) とする Merge( U(c), U(v), U(v) ) 計算量を O(TM) と書く
48
アルゴリズムの計算量 どの点も高々 1 回しか訪問しない 各点における操作 全 Merge 回数: n-1 回 (n : 点の個数)
点 v に関する下記の操作は 1 回しか実行しない 各点における操作 Merge の操作 質問点対があれば,Find の操作 子を順に探索するための操作 全 Merge 回数: n-1 回 (n : 点の個数) 全 Find 回数: m 回 (m : 質問点対の個数) 全計算量 O( 全 Merge の計算量 + 全 Find の計算量 + その他 ) = O( (n-1)・TM + m・TF + n )
49
Merge-Find 集合とMerge-Find 木
効率的なデータ構造
50
Merge-Find 集合 (MF set) 以下の操作を持った抽象データ型 Merge( A, B, C ) Find( x )
C := A∪B とする手続き. A∩B=φなる集合 A, B に対する Union( A, B, C ) と同じ. Find( x ) 要素 x を含む集合を返す関数. Initialize( A, a ) 要素 a だけから成る集合 A を作る手続き
51
Merge-Find 木 MF 木 U a c e f g h b MF 木 U ・ 各集合を根付き木で表現 ・ 根には集合名を覚える
B = { a, b, d, g, h } C = { c } E = { e } F = { f } B C E F a c e f g h b MF 木 U ・ 各集合を根付き木で表現 ・ 根には集合名を覚える ・ 各点は親へのポインタを持つ d * : 集合名 * : 要素
52
Merge( C, E, C ) MF 木 U c e a c e f C = { c, e } g h b d
B = { a, b, d, g, h } C = { c } E = { e } F = { f } c e C B C E F a c e f C = { c, e } g h b d Merge の計算量 : TM = O(1)
53
Find( d ) MF 木 U a a e f g g h b c MF 木 U の点 d から, 親を辿り,根まで到達すれば,
B = { a, b, d, g, h } C = { c, e } F = { f } B B C F a a e f g g h b c MF 木 U の点 d から, 親を辿り,根まで到達すれば, そこには集合名が書かれている d d Find の計算量 : TM = O( 木の高さ h(・) )
54
? Merge( C, F, F ) c e f e f c F = { c, e, f } c f e F C F
B = { a, b, d, g, h } C = { c, e } F = { f } e f c ? F = { c, e, f } c f e F Find の手間が小さくなるので, 好ましい
55
Merge 操作の改良 木の高さを抑える Find の効率化になる
56
Merge( A, B, C ) |A| > |B| a a b b C A B 要素数の少ない木の根を, もう一方の木の根の子にする
要素数が n の木の 高さは,常に O(logn) 各木の点の個数を覚えていれば,Merge の計算量 TM = O(1)
57
命題 点の個数の少ない方の木の根を, 個数が大きい方の木の根の子にするように Merge を行うと,
木の点の個数を n とすると, できた木の高さ h(・) は高々
58
数学的帰納法で証明 , n = 1 のとき,木の高さ h(・) は 0 であり, であるから, n = 1 のとき成立する.
n < n’ のとき成立を仮定し,n = n’ の時を考える. n = n’ の木が,Merge( A, B, C ) でできたとすると, |A| < n, |B| < n であるから,帰納法の仮定より, A, B の高さ h(A), h(B) は ,
59
数学的帰納法で証明 一方,木 C の高さ h(C) は, h(C) = max[ h(A), h(B)+1 ] であるから, a b
一般性を失うことなく, |A| |B| と仮定できる. C a h(A) b A h(B) B Q.E.D.
60
木の高さを抑える 後の Find の効率化になる 均し計算量
61
Find の改良 最下位共通先祖のアルゴリズムの計算量 全 Find の計算量 O( m・logn ) の削減
O( (n-1)・TM + m・TF + n ) = O( (n-1) + m・logn + n ) = O( m・logn + n ) 全 Find の計算量 O( m・logn ) の削減 道の圧縮(path compression)
62
Find の改良 (道の圧縮) Find の操作において辿った点を 全て木の根の子にする操作 c g x a b e f d a a g g
Find(x) d x x
63
Find の改良 (道の圧縮) Find の最悪計算量 TF のオーダは変化なし a a a g g b c x g b c c e f d
Find(x) d e f d x x
64
Find の改良 (道の圧縮) しかし,全 Find 操作に要する総計算量 O(m・TF) は
O(m・logn) から O(m・α(n) ) になる ここで, α(n) はアッカーマン(Ackerman) 関数の逆関数
65
Ackermann’s Function アッカーマン関数
66
アッカーマン関数の逆関数 pseudo-inverse function of Ackermann’s function
67
アッカーマン関数の逆関数 アッカーマン(Ackerman)関数の逆関数 α(n) は
n < 216 なる n に対して, α(n) ≦ 3 216 ≦ n < 265,536 なる n に対して, α(n) = 4 なので 実用上,定数 O(1) と考えても良い.
68
均し計算量 均し計算量(amortized time complexity) ある操作 A の均し計算量とは, A が何回か繰返された時,
69
均し計算量 MF 木の Find 操作に関しては, Merge と Find がどのような順序で行われても,
m 回の Find に要する総計算量は,高々 O( m・α(n) ) なので, Find 1回当たりの計算量(均し計算量)は O(α(n) )
70
均し計算量 最下位共通先祖を求めるアルゴリズムを 効率化するには, Find の最悪計算量を小さくするのではなく
最下位共通先祖を求めるアルゴリズムを 効率化するには, Find の最悪計算量を小さくするのではなく 全 Find に要する総計算量を 小さくしなければならない すなわち,Find の均し計算量を小さくすれば良い
71
均し計算量 最悪計算量を小さくするデータ構造は, しばしば,複雑で,実際の計算時間が長い
最悪計算量を小さくするデータ構造は, しばしば,複雑で,実際の計算時間が長い 均し計算量を小さくするデータ構造は, 単純で,実際の計算時間も小さくなる ことが多い このため,均し計算量は, データ構造を考える上での重要な概念
72
最下位共通先祖問題に対するアルゴリズム実現用
データ構造の詳細 最下位共通先祖問題に対するアルゴリズム実現用
73
木 T に必要なデータ構造 集合 U(・) : MF 木で実現する 木 T = (V,E) の各点 v∈V に対して
Merge : 集合名を指定する Find : 要素名を指定する 木 T = (V,E) の各点 v∈V に対して lm_child(v) : v の長男 r_sibling(v) : v の次弟 mark(v) : 未探索,探索中,探索済みの印 集合 P(v) : v を含む質問点対の集合 集合 U(v) : 集合名 U(v) を持つ MF 木の根 MF点 MFnode(v) : v を示す MF 木内の点
74
MF 木のデータ構造 MF 木の根が持つべきデータ MF 木の点が持つべきデータ set_name : その木が表す集合の名称 U(・)
size : その木に含まれる要素の個数 MF 木の点が持つべきデータ parent : その点の親(根まで辿れるように) set_name size parent MF 木の点用のセル
75
Merge-Find 木 MF 木 U a e f g h b c d U(b) U(c) U(f) U(b) U(c) U(f) ・ ・
5 c 2 f 5 g h b c d 根には,集合名 U(v) の v だけを書いておく
76
木 T のデータ構造 各点 v∈V に対して lm_child(v) : 長男のセルへのポインタ
r_sibling(v) : 次弟のセルへのポインタ mark(v) : 未探索,探索中,探索済みの印 集合 P(v) : 連結リストへのポインタ 集合 U(v) : MF 木の根のセルへのポインタ MF点 MFnode(v) : MF 木内の点のセルへのポインタ mark U(・) lm_child 木 T の点用のセル r_sibling Mfnode(・) P(・)
77
木 T のデータ構造 木 T b d c e f a h g mark U LmC RSb Mfn P(・) c h ・ e f g
78
木 T と MF 木との関連 b d d c e f a h g g M U Mfn M U Mfn ・ ・ ・ ・ MF 木 g 1 a
79
木 T と MF 木との関連 点 a に戻った時点 b b a d d c e g f a h g ・ 2 a 1 MF 木 ・ ・ g 1
U Mfn ・ 点 a に戻った時点 M U Mfn ・ M U Mfn ・ M U Mfn ・ b b a M U Mfn ・ M U Mfn ・ M U Mfn ・ d d c e g M U Mfn ・ f a h ・ 2 a 1 MF 木 g ・ ・ g 1 d 1 f 1
80
木 T と MF 木との関連 点 a に戻った時点 d b b a d d c e g f a h g ・ 2 a 1 MF 木 ・ ・ g
U Mfn ・ 点 a に戻った時点 d M U Mfn ・ M U Mfn ・ M U Mfn ・ b b a M U Mfn ・ M U Mfn ・ M U Mfn ・ d d c e g M U Mfn ・ f a h ・ 2 a 1 MF 木 g ・ ・ g 1 d 1 f 1
81
木 T と MF 木との関連 点 d に戻った時点 d b a d c e g f a h g ・ d 3 a 2 MF 木 ・ ・ g 1
U Mfn ・ 点 d に戻った時点 d M U Mfn ・ M U Mfn ・ M U Mfn ・ b a M U Mfn ・ M U Mfn ・ M U Mfn ・ d c e g M U Mfn ・ f a h ・ d 3 a 2 MF 木 g ・ ・ g 1 d 1 f 1
82
木 T と MF 木との関連 点 d に戻った時点 d b a d c e g f a h g ・ d 3 a 1 MF 木 ・ ・ g 1
U Mfn ・ 点 d に戻った時点 d M U Mfn ・ M U Mfn ・ M U Mfn ・ b a M U Mfn ・ M U Mfn ・ M U Mfn ・ d c e g M U Mfn ・ f a h ・ d 3 a 1 MF 木 g ・ ・ g 1 d 1 f 1
83
木 T と MF 木との関連 点 d に戻った時点 d b a d c e g f a h g ・ d 3 a 1 MF 木 ・ ・ g 1
U Mfn ・ 点 d に戻った時点 d M U Mfn ・ M U Mfn ・ M U Mfn ・ b a M U Mfn ・ M U Mfn ・ M U Mfn ・ d c e g M U Mfn ・ f a h ・ d 3 a 1 MF 木 g ・ ・ g 1 d 1 f 1
84
木 T と MF 木との関連 点 h を深さ優先探索 d b a h d c e g f a h g ・ d 3 MF 木 ・ ・ g 1
U Mfn ・ 点 h を深さ優先探索 d M U Mfn ・ M U Mfn ・ M U Mfn ・ b a M U Mfn ・ M U Mfn ・ h M U Mfn ・ d c e g M U Mfn ・ f a h ・ d 3 MF 木 g ・ ・ g 1 h 1 f 1
85
木 T と MF 木との関連 点 d に戻った時点 d b a h d c e g f a h g ・ d 4 3 MF 木 ・ ・ g 1
U Mfn ・ 点 d に戻った時点 d M U Mfn ・ M U Mfn ・ M U Mfn ・ b a M U Mfn ・ M U Mfn ・ h M U Mfn ・ d c e g M U Mfn ・ f a h ・ d 4 3 MF 木 g ・ ・ g 1 h 1 f 1
86
木 T と MF 木との関連 点 d に戻った時点 d b a h d c e g f a h g ・ d 4 MF 木 ・ g 1 f 1
U Mfn ・ 点 d に戻った時点 d M U Mfn ・ M U Mfn ・ M U Mfn ・ b a M U Mfn ・ M U Mfn ・ h M U Mfn ・ d c e g M U Mfn ・ f a h ・ d 4 MF 木 g ・ g 1 f 1
87
まとめ オフライン最下位共通先祖問題を例に, MF 木と均し計算量の説明をした. また,アルゴリズムの解析と実現についても触れた.
アルゴリズムが与えられたとき,ここで述べたような手順でデータ構造を構築できれば,単位を修得!!
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.