87
1 最最最最最最最最最最 MF 最 ここここここここここ ** ** ここここここ Merge-Find ここ Union-Find こここここ Merge-Find Merge-Find tree こここここここ こここここ amortized

最下位共通先祖問題と MF 木

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

Page 1: 最下位共通先祖問題と  MF  木

1最下位共通先祖問題と MF 木

  ** ここで理解すべき内容 **

抽象データ型 Merge-Find 集合 ( Union-Find 集

合)

データ構造 Merge-Find 木 ( Merge-Find

tree )

計算量評価方法 均し計算量 ( amortized

complexity )

Page 2: 最下位共通先祖問題と  MF  木

2

例として考える問題

オフライン  最下位共通先祖          問題

Page 3: 最下位共通先祖問題と  MF  木

3オフライン最下位共通先祖問題

Off-line Lowest Common Ancestors Problem

 入力: 根付き木 T = (V,E) 点対の集合 P = { p=(v,w) | v, w は T の

点 }

 出力: 各点対 p=(v,w)∈P に対する   (木 T 上での)最下位共通先祖 anc(p)

Page 4: 最下位共通先祖問題と  MF  木

4

最下位共通先祖

木 T 上の質問点対 p=(v,w) に対する 最下位共通先祖 anc(p) = a

木 T の点 a で,以下の性質を持つもの v と w の共通の先祖であり, a の真の子孫には

v と w の共通の先祖が無い

Page 5: 最下位共通先祖問題と  MF  木

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) }

Page 6: 最下位共通先祖問題と  MF  木

6オフライン( off-line )問題

オフライン( off-line )問題

全ての質問を予め知った上で  各質問に対する答えを

求めるもの

オンライン( on-line )問題

全質問を予め知ることができず,  質問毎に答えを出すも

Page 7: 最下位共通先祖問題と  MF  木

7

オフライン最下位共通先祖問題に対するアルゴリズム

Page 8: 最下位共通先祖問題と  MF  木

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

Page 9: 最下位共通先祖問題と  MF  木

9点 v からの帰りがけ時の検査

(v,w)∈P なる質問点対が存在し w は既に探索済みか?

  もし,そうならば,

w の先祖で探索中の点の内,最下位にある点 a は,v と w の最下位共通先祖 anc( (v,w) )

d

w

v

e

b

a

Page 10: 最下位共通先祖問題と  MF  木

10

必要な操作1. 点 v を含む質問点対

(v,w) ∈P が存在するか否かの検査

2. もう一方の点 w は既に探索済みか否かの検査

3. w の探索中の先祖で,最下位の点の探索

これらを効率良く実行したい

d

w

v

e

b

a

Page 11: 最下位共通先祖問題と  MF  木

11

必要な操作 1

点 v を含む質問点対 (v,w)∈P  が存在するか否かの検査に対し

ては,

木 T の各点 v に対して,v を含む質問点対 p=(v,w) ∈ P の集

P(v) = { p | p=(v,w)∈ P }

  を覚えておくvw w'

Page 12: 最下位共通先祖問題と  MF  木

12

必要な操作 2

点 v を含む質問点対 (v,w)∈P のもう一方の点 w が,   既に探索済みか否かの検査は

点に   未探索   探索中   探索済みの印を付けておけば良い

d

w

v

e

b

a

Page 13: 最下位共通先祖問題と  MF  木

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

Page 14: 最下位共通先祖問題と  MF  木

14

アルゴリズムの例

集合 U( ・ ) に対する操作

Page 15: 最下位共通先祖問題と  MF  木

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) }

Page 16: 最下位共通先祖問題と  MF  木

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) }

Page 17: 最下位共通先祖問題と  MF  木

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) }

Page 18: 最下位共通先祖問題と  MF  木

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) }

Page 19: 最下位共通先祖問題と  MF  木

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) }

Page 20: 最下位共通先祖問題と  MF  木

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) }探索済

Page 21: 最下位共通先祖問題と  MF  木

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) }

Page 22: 最下位共通先祖問題と  MF  木

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) }

Page 23: 最下位共通先祖問題と  MF  木

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) }

Page 24: 最下位共通先祖問題と  MF  木

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) }

Page 25: 最下位共通先祖問題と  MF  木

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) }

Page 26: 最下位共通先祖問題と  MF  木

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) }

Page 27: 最下位共通先祖問題と  MF  木

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) }

Page 28: 最下位共通先祖問題と  MF  木

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) }

Page 29: 最下位共通先祖問題と  MF  木

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) }

Page 30: 最下位共通先祖問題と  MF  木

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) }

Page 31: 最下位共通先祖問題と  MF  木

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) }

Page 32: 最下位共通先祖問題と  MF  木

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) }

Page 33: 最下位共通先祖問題と  MF  木

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) }

Page 34: 最下位共通先祖問題と  MF  木

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) }

Page 35: 最下位共通先祖問題と  MF  木

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) }

Page 36: 最下位共通先祖問題と  MF  木

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) }

Page 37: 最下位共通先祖問題と  MF  木

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) }

Page 38: 最下位共通先祖問題と  MF  木

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

Page 39: 最下位共通先祖問題と  MF  木

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 }

Page 40: 最下位共通先祖問題と  MF  木

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 }

Page 41: 最下位共通先祖問題と  MF  木

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

Page 42: 最下位共通先祖問題と  MF  木

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 }

Page 43: 最下位共通先祖問題と  MF  木

43

根 b に戻り

cd

g

f

e

ha

b

木 T

B = U(b) = { a, b, c, d, e, f, g, h }b

全探索終了

Page 44: 最下位共通先祖問題と  MF  木

44

アルゴリズムの記述と

計算量

深さ優先探索の再帰的記述

Page 45: 最下位共通先祖問題と  MF  木

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 ) を呼ぶ.

Page 46: 最下位共通先祖問題と  MF  木

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( )

実は不要

Page 47: 最下位共通先祖問題と  MF  木

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) と書く

Page 48: 最下位共通先祖問題と  MF  木

48

アルゴリズムの計算量

どの点も高々 1 回しか訪問しない 点 v に関する下記の操作は 1 回しか実行しない

各点における操作 Merge の操作 質問点対があれば, Find の操作 子を順に探索するための操作

全 Merge 回数:  n-1 回 ( n : 点の個数) 全 Find 回数:   m 回 ( m : 質問点対の個

数) 全計算量

O( 全 Merge の計算量 + 全 Find の計算量 + その他 )

= O( (n-1) ・ TM + m ・ TF + n )

Page 49: 最下位共通先祖問題と  MF  木

49

Merge-Find 集合と Merge-Find 木

Merge, Find に対する効率的なデータ構造

Page 50: 最下位共通先祖問題と  MF  木

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 を作る手続き

Page 51: 最下位共通先祖問題と  MF  木

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 ・ 各集合を根付き木で表現 ・ 根には集合名を覚える ・ 各点は親へのポインタを持つ

Page 52: 最下位共通先祖問題と  MF  木

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)

Page 53: 最下位共通先祖問題と  MF  木

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( ・ ) )

Page 54: 最下位共通先祖問題と  MF  木

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 の手間が小さくなるので,好ましい

?

Page 55: 最下位共通先祖問題と  MF  木

55

Merge 操作の改良

木の高さを抑えるFind の効率化になる

Page 56: 最下位共通先祖問題と  MF  木

56

Merge( A, B, C )

b

B

a

A

b

a

C

要素数の少ない木の根を,もう一方の木の根の子にする

|A| > |B|

要素数が n の木の高さは,常に O(logn)

各木の点の個数を覚えていれば, Merge の計算量  TM = O(1)

Page 57: 最下位共通先祖問題と  MF  木

57

命題

点の個数の少ない方の木の根を,

個数が大きい方の木の根の子にするように

Merge を行うと,

どのような順序で Merge が行われても,

木の点の個数を n とすると,

  できた木の高さ h( ・ ) は高々 nlog

2

Page 58: 最下位共通先祖問題と  MF  木

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 ,

Page 59: 最下位共通先祖問題と  MF  木

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.

Page 60: 最下位共通先祖問題と  MF  木

60

Find 操作の改良

木の高さを抑える後の Find の効率化になる均し計算量

Page 61: 最下位共通先祖問題と  MF  木

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 )

Page 62: 最下位共通先祖問題と  MF  木

62

Find の改良 (道の圧縮) Find の操作において辿った点を 全て木の根の子にする操作

c

g

x

a

b

B

e f

d

c gx

a

b

B

e fdc

g

a

x

Find(x)

Page 63: 最下位共通先祖問題と  MF  木

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)

Page 64: 最下位共通先祖問題と  MF  木

64

Find の改良 (道の圧縮)

O(m ・ logn) から O(m ・ α(n) ) になる

ここで, α(n) はアッカーマン( Ackerman )  関数の逆関数

しかし,全 Find 操作に要する総計算量 O(m ・ TF) は

Page 65: 最下位共通先祖問題と  MF  木

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

Page 66: 最下位共通先祖問題と  MF  木

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

Page 67: 最下位共通先祖問題と  MF  木

67

アッカーマン関数の逆関数 アッカーマン( Ackerman )関数の

逆関数  α(n) は

n < 216 なる n に対して, α(n) 3≦

216 n <≦   265,536    なる n に対して,

α(n) = 4  なので

実用上,定数 O(1) と考えても良い.

Page 68: 最下位共通先祖問題と  MF  木

68

均し計算量

均し計算量( amortized time complexity )

ある操作 A の均し計算量とは,

A が何回か繰返された時, その最悪総計算量を,

繰返し回数で割った操作 A の 1 回当たりの計

算量

Page 69: 最下位共通先祖問題と  MF  木

69

均し計算量

MF 木の Find 操作に関しては,

Merge と Find がどのような順序で行われても,

m 回の Find に要する総計算量は,高々O( m ・ α(n) ) なので,

Find 1回当たりの計算量(均し計算量)は

O(α(n) )

Page 70: 最下位共通先祖問題と  MF  木

70

均し計算量

最下位共通先祖を求めるアルゴリズムを  効率化するには,

Find の最悪計算量を小さくするのではなく

全 Find に要する総計算量を 小さくしなければな

らない すなわち, Find の均し計算量を小さくすれば良い

Page 71: 最下位共通先祖問題と  MF  木

71

均し計算量

最悪計算量を小さくするデータ構造は,  しばしば,複雑で,実際の計算時間が長い

均し計算量を小さくするデータ構造は,  単純で,実際の計算時間も小さくなる  ことが多い

 このため,均し計算量は, データ構造を考える上での重要な概

Page 72: 最下位共通先祖問題と  MF  木

72

データ構造の詳細

最下位共通先祖問題に対するアルゴリズム実現用

Page 73: 最下位共通先祖問題と  MF  木

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 木内の点

Page 74: 最下位共通先祖問題と  MF  木

74

MF 木のデータ構造 MF 木の根が持つべきデータ

set_name   :  その木が表す集合の名称 U( ・ )

size :    その木に含まれる要素の個数

MF 木の点が持つべきデータ parent   :  その点の親(根まで辿れるよう

に)

set_name size

parentMF 木の点用のセル

Page 75: 最下位共通先祖問題と  MF  木

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)

Page 76: 最下位共通先祖問題と  MF  木

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( ・ )

Page 77: 最下位共通先祖問題と  MF  木

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( ・ )

Page 78: 最下位共通先祖問題と  MF  木

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

Page 79: 最下位共通先祖問題と  MF  木

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 木

Page 80: 最下位共通先祖問題と  MF  木

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 木

Page 81: 最下位共通先祖問題と  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

Page 82: 最下位共通先祖問題と  MF  木

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

Page 83: 最下位共通先祖問題と  MF  木

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

Page 84: 最下位共通先祖問題と  MF  木

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

Page 85: 最下位共通先祖問題と  MF  木

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

Page 86: 最下位共通先祖問題と  MF  木

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 に戻った時点

Page 87: 最下位共通先祖問題と  MF  木

87

まとめ

オフライン最下位共通先祖問題を例に,MF 木と均し計算量の説明をした.

また,アルゴリズムの解析と実現についても触れた.

アルゴリズムが与えられたとき,ここで述べたような手順でデータ構造を構築できれば,単位を修得!!