Upload
hedley-hewitt
View
24
Download
1
Embed Size (px)
DESCRIPTION
最下位共通先祖問題と MF 木. ** ここで理解すべき内容 ** 抽象データ型 Merge-Find 集合 ( Union-Find 集合) データ構造 Merge-Find 木 ( Merge-Find tree ) 計算量評価方法 均し計算量 ( amortized complexity ). 例として考える問題. オフライン 最下位共通先祖 問題. オフライン最下位共通先祖問題. Off-line Lowest Common Ancestors Problem 入力: 根付き木 T = (V,E) - PowerPoint PPT Presentation
Citation preview
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オフライン最下位共通先祖問題
cd
g
f
e
ha
b
木 T
最下位共通先祖 anc( (c,h) ) = b anc( (e,f) ) = e anc( (f,g) ) = b anc( (g,h) ) = d
質問点対の集合 P
P = { (c,h), (e,f),
(f,g), (g,h) }
6オフライン( off-line )問題
オフライン( off-line )問題
全ての質問を予め知った上で 各質問に対する答えを
求めるもの
オンライン( on-line )問題
全質問を予め知ることができず, 質問毎に答えを出すも
の
7
オフライン最下位共通先祖問題に対するアルゴリズム
8
アルゴリズム 木 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 */
帰りがけに,最下位共通先祖が求められる ?
c
v
c'
r
9点 v からの帰りがけ時の検査
(v,w)∈P なる質問点対が存在し w は既に探索済みか?
もし,そうならば,
w の先祖で探索中の点の内,最下位にある点 a は,v と w の最下位共通先祖 anc( (v,w) )
d
w
v
e
b
a
10
必要な操作1. 点 v を含む質問点対
(v,w) ∈P が存在するか否かの検査
2. もう一方の点 w は既に探索済みか否かの検査
3. w の探索中の先祖で,最下位の点の探索
これらを効率良く実行したい
d
w
v
e
b
a
11
必要な操作 1
点 v を含む質問点対 (v,w)∈P が存在するか否かの検査に対し
ては,
木 T の各点 v に対して,v を含む質問点対 p=(v,w) ∈ P の集
合
P(v) = { p | p=(v,w)∈ P }
を覚えておくvw w'
12
必要な操作 2
点 v を含む質問点対 (v,w)∈P のもう一方の点 w が, 既に探索済みか否かの検査は
点に 未探索 探索中 探索済みの印を付けておけば良い
d
w
v
e
b
a
13
必要な操作 3
点 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
w
v
e
b
a
14
アルゴリズムの例
集合 U( ・ ) に対する操作
15木 T と集合 U( ・ ) および P( ・ )
cd
g
f
e
ha
b
木 TA = 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 }
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) }
16
木 T の深さ優先探索
cd
g
f
e
ha
b
木 TA = 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 }
探索中
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) }
17
木 T の深さ優先探索
cd
g
f
e
ha
b
木 TA = 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 }
探索中
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) }
18
木 T の深さ優先探索
cd
g
f
e
ha
b
木 TA = 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 }
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) }
19
木 T の深さ優先探索
cd
g
f
e
ha
b
木 TA = 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 }
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) }
20点 g の探索終了: P(g) の検査
cd
g
f
e
ha
b
木 TA = 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 }
f, 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) }探索済
21点 g から戻る: A と G の併合
cd
g
f
e
ha
b
木 TA = 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 }
A = U(a) = { a, g }
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) }
22
点 a に戻った
cd
g
f
e
ha
b
木 TA = 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 }
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) }
23点 a の探索終了: P(a) は空
cd
g
f
e
ha
b
木 TA = 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 }
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) }
24点 a から戻る : A と D を併合
cd
g
f
e
ha
b
木 TA = 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 }
D = U(d) = { a, d, g }
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) }
25
点 d に戻った
cd
g
f
e
ha
b
木 TA = 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 }
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) }
26
点 h を深さ優先探索
cd
g
f
e
ha
b
木 TA = 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 }
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) }
27点 h の探索終了: P(h) の検査
cd
g
f
e
ha
b
木 TA = 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 }
g は探索済み⇒ anc((g,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) }
28点 g を含む集合 U( ・ ) の探索
cd
g
f
e
ha
b
木 TA = 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 }
g U(d)∈⇒ anc((g,h)) = d
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) }
29点 h から戻る : H と D を併合
cd
g
f
e
ha
b
木 TA = 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 }
D = U(d) = { a, d, g, 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) }
30
点 d に戻った
cd
g
f
e
ha
b
木 TA = 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 }
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) }
31
点 d から戻る
cd
g
f
e
ha
b
木 TA = 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 }
P(d) は空⇒ B と D を併合
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) }
32
点 b に戻った
cd
g
f
e
ha
b
木 TA = 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 }
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) }
33
点 c を深さ優先探索
cd
g
f
e
ha
b
木 TA = 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 }
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) }
34点 c の探索終了: P(c) の検査
cd
g
f
e
ha
b
木 TA = 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 }
h は探索済み⇒ anc((c,h)) は ?
h を含む U( ・ ) は ?⇒ anc((c,h)) = b
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) }
35点 c から戻る : C と B を併合
cd
g
f
e
ha
b
木 TA = 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 }
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) }
36
点 b に戻った
cd
g
f
e
ha
b
木 TA = 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 }
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) }
37
点 e, f へ深さ優先探索
cd
g
f
e
ha
b
木 TA = 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 }
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) }
38点 f の探索終了 : P(f) の検査
cd
g
f
e
ha
b
木 TA = 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 }
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 は探索済み⇒ anc((f,g)) は ?
g を含む U( ・ ) は ?⇒ anc((f,g)) = b
39点 f から戻る : F と E の併合
cd
g
f
e
ha
b
木 T
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) }
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 }
40
点 e に戻った
cd
g
f
e
ha
b
木 T
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) }
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 }
41
点 e の探索終了
cd
g
f
e
ha
b
木 T
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) }
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 }
f は探索済み⇒ anc((e,f)) は ?
f を含む U( ・ ) は ?⇒ anc((e,f)) = e
42点 e から戻る : E と B の併合
cd
g
f
e
ha
b
木 T
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) }
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 }
43
根 b に戻り
cd
g
f
e
ha
b
木 T
B = U(b) = { a, b, c, d, e, f, g, h }b
全探索終了
44
アルゴリズムの記述と
計算量
深さ優先探索の再帰的記述
45
アルゴリズムの概要 void DFS( v, T ) /* 再帰的関数 */
木 T の点 v を根とする部分木の深さ優先探索をする関数
入力: v : NODE (値呼び) T : 木 P(v) : v を含む質問点対の集合
出力: anc(p) : 各質問点対 p に対する最下位共通先祖
NODE c /* 局所変数 */
各点 v に対して,未探索の印しを付けておき, 集合 U(v) の初期化 U(v) = { v } を行って, 関数 DFS( 木 T の根, T ) を呼ぶ.
46
アルゴリズムの概要 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 */
Find( )
Merge( )
実は不要
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 回しか訪問しない 点 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 木
Merge, Find に対する効率的なデータ構造
50Merge-Find 集合 ( MF set ) 以下の操作を持った抽象データ型
Merge( A, B, C ) 互いに素な集合 A および B に対して,
C := A∪B とする手続き. A∩B=φ なる集合 A, B に対する Union( A, B, C )
と同じ.
Find( x ) 要素 x を含む集合を返す関数.
Initialize( A, a ) 要素 a だけから成る集合 A を作る手続き
51
Merge-Find 木
c
d
g
fe
h
a
b
MF 木 U B = { a, b, d, g, h }C = { c }E = { e }F = { f }
ECB F
*
* : 要素
: 集合名
MF 木 U ・ 各集合を根付き木で表現 ・ 根には集合名を覚える ・ 各点は親へのポインタを持つ
52
Merge( C, E, C )
c
d
g
fe
h
a
b
MF 木 U
ECB F
B = { a, b, d, g, h }C = { c }E = { e }F = { f }
C = { c, e }
c
e
C
Merge の計算量 : TM = O(1)
53
Find( d )
d
g
f
h
a
b
MF 木 U
B F
B = { a, b, d, g, h }C = { c, e }F = { f }
c
e
C
d
g
a
B
MF 木 U の点 d から,親を辿り,根まで到達すれば,そこには集合名が書かれているFind の計算量 : TM = O( 木の高さ
h( ・ ) )
54
Merge( C, F, F )
f
FB = { a, b, d, g, h }C = { c, e }F = { f }
c
e
C
F = { c, e, f }c
e
f
F
c f
e
F
Find の手間が小さくなるので,好ましい
?
55
Merge 操作の改良
木の高さを抑えるFind の効率化になる
56
Merge( A, B, C )
b
B
a
A
b
a
C
要素数の少ない木の根を,もう一方の木の根の子にする
|A| > |B|
要素数が n の木の高さは,常に O(logn)
各木の点の個数を覚えていれば, Merge の計算量 TM = O(1)
57
命題
点の個数の少ない方の木の根を,
個数が大きい方の木の根の子にするように
Merge を行うと,
どのような順序で Merge が行われても,
木の点の個数を n とすると,
できた木の高さ h( ・ ) は高々 nlog
2
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) は
01loglog 22 n
nAA 22 log||log)(h nBB 22 log||log)(h ,
59
数学的帰納法で証明
一方,木 C の高さ h(C) は,
h(C) = max[ h(A), h(B)+1 ]
であるから, 一般性を失うことなく,
|A| |B| と仮定できる.
b
a
C
A
B
h(A)
h(B)
nnn
BA
BAC
222
22
22
loglog,logmax
||2log,||logmax
1||log,||logmax)(h
Q.E.D.
60
Find 操作の改良
木の高さを抑える後の Find の効率化になる均し計算量
61
Find の改良
最下位共通先祖のアルゴリズムの計算量
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
B
e f
d
c gx
a
b
B
e fdc
g
a
x
Find(x)
63
Find の改良 (道の圧縮)
Find の最悪計算量 TF のオーダは変化なし
c
g
x
a
b
B
e f
d
c gx
a
b
B
e fdc
g
a
x
Find(x)
64
Find の改良 (道の圧縮)
O(m ・ logn) から O(m ・ α(n) ) になる
ここで, α(n) はアッカーマン( Ackerman ) 関数の逆関数
しかし,全 Find 操作に要する総計算量 O(m ・ TF) は
65
Ackermann’s Function
アッカーマン関数
000,20536,653,2
1622,2
421,2
2
10223,2,14,2
536,652222,2,13,2
162221,2,12,2
422,11,2
22
2
A
A
A
AAA
AAA
AAA
AA
2,:1,,1,
2:2,11,
2:2,1
jijiAiAjiA
iiAiA
jjA j
536,65221,3,22,31,4
162,21,3161,3
AAAAA
AA
66
アッカーマン関数の逆関数
pseudo-inverse function of Ackermann’s function nnniAin ,log1,|1min 2
nn
miAinm 2log,|1min,
41,4log22
31,3log22
2655361,4
2161,3
nAnn
nAnnA
A
21,2log22
11,1log22
221,2
21,1
nAnn
nAnnA
A
1,2 iAn
67
アッカーマン関数の逆関数 アッカーマン( Ackerman )関数の
逆関数 α(n) は
n < 216 なる n に対して, α(n) 3≦
216 n <≦ 265,536 なる n に対して,
α(n) = 4 なので
実用上,定数 O(1) と考えても良い.
68
均し計算量
均し計算量( amortized time complexity )
ある操作 A の均し計算量とは,
A が何回か繰返された時, その最悪総計算量を,
繰返し回数で割った操作 A の 1 回当たりの計
算量
69
均し計算量
MF 木の Find 操作に関しては,
Merge と Find がどのような順序で行われても,
m 回の Find に要する総計算量は,高々O( m ・ α(n) ) なので,
Find 1回当たりの計算量(均し計算量)は
O(α(n) )
70
均し計算量
最下位共通先祖を求めるアルゴリズムを 効率化するには,
Find の最悪計算量を小さくするのではなく
全 Find に要する総計算量を 小さくしなければな
らない すなわち, Find の均し計算量を小さくすれば良い
71
均し計算量
最悪計算量を小さくするデータ構造は, しばしば,複雑で,実際の計算時間が長い
均し計算量を小さくするデータ構造は, 単純で,実際の計算時間も小さくなる ことが多い
このため,均し計算量は, データ構造を考える上での重要な概
念
72
データ構造の詳細
最下位共通先祖問題に対するアルゴリズム実現用
73
木 T に必要なデータ構造 集合 U( ・ ) : MF 木で実現する
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 木の根が持つべきデータ
set_name : その木が表す集合の名称 U( ・ )
size : その木に含まれる要素の個数
MF 木の点が持つべきデータ parent : その点の親(根まで辿れるよう
に)
set_name size
parentMF 木の点用のセル
75
Merge-Find 木
c
d
g
fe
h
a
b
MF 木 U
U(c)U(b) U(f)
b 5・
c 2・
f 5・
根には,集合名 U(v) の v だけを書いておく
U(c)U(b) U(f)
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_siblingMfnode( ・ )
P( ・ )
77
木 T のデータ構造
cd
g
f
e
ha
b
木 T
M UMfn
・ M UMfn・
M UMfn・
M UMfn
・ M UMfn・・
M UMfn・・
M UMfn・・
M UMfn
・・
c h・e f ・
e f ・
f g g h・
c h g h・
g h・P( ・ ) 用のセル :
mark U
LmC RSbMfn
P( ・ )
78
木 T と MF 木との関連
M UMfn
・ M UMfn・
M UMfn・
M UMfn
・ M UMfn・・
M UMfn・・
M UMfn・・
M UMfn
・・
a 1・
cd
g
f
e
ha
b
g 1・
d 1・
f 1・
MF 木
M UMfn
g
d
M UMfn
79
木 T と MF 木との関連
M UMfn
・ M UMfn・
M UMfn・
M UMfn
・ M UMfn・・
M UMfn・・
M UMfn・・
M UMfn
・・
a 1・
cd
f
e
h
b
g 1 d 1・
f 1・
点 a に戻った時点
d
b
g
a
g
a
2MF 木
80
木 T と MF 木との関連
M UMfn
・ M UMfn・
M UMfn・
M UMfn
・ M UMfn・・
M UMfn・・
M UMfn・・
M UMfn
・・
a 1・
cd
f
e
h
b
g 1 d 1・
f 1・
点 a に戻った時点
d
b
g
a
g
a
2
d
MF 木
81
木 T と MF 木との関連
cd
g
f
e
a
b
点 d に戻った時点M U
Mfn・ M U
Mfn・M U
Mfn・
M UMfn
・ M UMfn・・
M UMfn・・
M UMfn・・
M UMfn
・・
a 2・
g 1 d 1・
f 1・
g
a
d
d 3MF 木
h
82
木 T と MF 木との関連
cd
g
f
e
a
b
点 d に戻った時点M U
Mfn・ M U
Mfn・M U
Mfn・
M UMfn
・ M UMfn・・
M UMfn・・
M UMfn・・
M UMfn
・・
a 1・
g 1 d 1・
f 1・
g
a
d
d 3MF 木
h
83
木 T と MF 木との関連
cd
g
f
e
a
b
点 d に戻った時点M U
Mfn・ M U
Mfn・M U
Mfn・
M UMfn
・ M UMfn・・
M UMfn・・
M UMfn・・
M UMfn
・・
a 1・
g 1 d 1・
f 1・
g
a
d
d 3MF 木
h
84
木 T と MF 木との関連
cd
g
f
e
ha
b
点 h を深さ優先探索M U
Mfn・ M U
Mfn・M U
Mfn・
M UMfn
・ M UMfn・・
M UMfn・・
M UMfn・・
M UMfn
・・
d 3・
g 1 f 1・
g
a
d
MF 木
h 1・
h
85
木 T と MF 木との関連
cd
g
f
e
a
bM U
Mfn・ M U
Mfn・M U
Mfn・
M UMfn
・ M UMfn・・
M UMfn・・
M UMfn・・
M UMfn
・・
d 3・
g 1 f 1・
g
a
d
MF 木
h 1・
h
h
点 d に戻った時点
4
86
木 T と MF 木との関連
cd
g
f
e
a
bM U
Mfn・ M U
Mfn・M U
Mfn・
M UMfn
・ M UMfn・・
M UMfn・・
M UMfn・・
M UMfn
・・
d 4・
g 1 f 1・
g
a
d
MF 木
h
h
点 d に戻った時点
87
まとめ
オフライン最下位共通先祖問題を例に,MF 木と均し計算量の説明をした.
また,アルゴリズムの解析と実現についても触れた.
アルゴリズムが与えられたとき,ここで述べたような手順でデータ構造を構築できれば,単位を修得!!