slide1 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
最下位共通先祖問題と MF 木 PowerPoint Presentation
Download Presentation
最下位共通先祖問題と MF 木

Loading in 2 Seconds...

play fullscreen
1 / 87

最下位共通先祖問題と MF 木 - PowerPoint PPT Presentation


  • 128 Views
  • Uploaded on

最下位共通先祖問題と MF 木.   ** ここで理解すべき内容 ** 抽象データ型 Merge-Find 集合 ( Union-Find 集合) データ構造 Merge-Find 木 ( Merge-Find tree ) 計算量評価方法 均し計算量 ( amortized complexity ). 例として考える問題. オフライン   最下位共通先祖           問題. オフライン最下位共通先祖問題. Off-line Lowest Common Ancestors Problem  入力: 根付き木 T = (V,E)

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about '最下位共通先祖問題と MF 木' - hedley-hewitt


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide1
最下位共通先祖問題と MF 木

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

  • 抽象データ型
    • Merge-Find 集合 (Union-Find 集合)
  • データ構造
    • Merge-Find 木 (Merge-Find tree)
  • 計算量評価方法
    • 均し計算量 (amortized complexity)
slide2
例として考える問題

オフライン

  最下位共通先祖

          問題

slide3
オフライン最下位共通先祖問題
  • Off-line Lowest Common Ancestors Problem
  •  入力:
    • 根付き木 T = (V,E)
    • 点対の集合 P = { p=(v,w) | v, w は T の点 }
  •  出力:
    • 各点対 p=(v,w)∈P に対する

   (木 T 上での)最下位共通先祖 anc(p)

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

木 T の点 a で,以下の性質を持つもの

    • v と w の共通の先祖であり,
    • a の真の子孫には

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

slide5

質問点対の集合 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

off line
オフライン(off-line)問題
  • オフライン(off-line)問題
    • 全ての質問を予め知った上で

  各質問に対する答えを求めるもの

  • オンライン(on-line)問題
    • 全質問を予め知ることができず,

質問毎に答えを出すもの

slide7

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

slide8
アルゴリズム
  • 木 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

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

b

  • (v,w)∈P なる質問点対が存在し w は既に探索済みか?
  •   もし,そうならば,
  • w の先祖で探索中の点の内,

最下位にある点 a は,

v と w の最下位共通先祖

anc((v,w) )

d

a

e

w

v

slide10
必要な操作

b

  • 1. 点 v を含む質問点対 (v,w) ∈P が存在するか否かの検査
  • 2. もう一方の点 w は既に探索済みか否かの検査
  • 3. w の探索中の先祖で,最下位の点の探索
  • これらを効率良く実行したい

d

a

e

w

v

slide11
必要な操作 1
  • 点 v を含む質問点対 (v,w)∈P   が存在するか否かの検査に対しては,
  • 木 T の各点 v に対して,

v を含む質問点対 p=(v,w) ∈ P の集合

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

 を覚えておく

w

w'

v

slide12
必要な操作 2

b

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

の印を付けておけば良い

d

a

e

w

v

slide13
必要な操作 3

b

  • 点 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

slide14

アルゴリズムの例

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

t u p
木 T と集合 U(・) および P(・)

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

slide16

探索中

木 T の深さ優先探索

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

slide17
木 T の深さ優先探索

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

slide18
木 T の深さ優先探索

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

slide19
木 T の深さ優先探索

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

g p g

探索済

点 g の探索終了: P(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 は未探索

⇒ 何もしない

g a g

A = U(a) = { a, g }

点 g から戻る:  A と 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

slide22
点 a に戻った

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

a p a
点 a の探索終了:  P(a) は空

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

a a d

D = U(d) = { a, d, g }

点 a から戻る : A と D を併合

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

slide25
点 d に戻った

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

slide26
点 h を深さ優先探索

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

h p h
点 h の探索終了: P(h) の検査

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)) は?

slide28
点 g を含む集合 U(・) の探索

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

h h d

D = U(d) = { a, d, g, h }

点 h から戻る : H と D を併合

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

slide30
点 d に戻った

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

slide31
点 d から戻る

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 を併合

slide32
点 b に戻った

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

slide33
点 c を深さ優先探索

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

c p c
点 c の探索終了: P(c) の検査

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)) は?

c c b
点 c から戻る : C と B を併合

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

slide36
点 b に戻った

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

slide37
点 e, f へ深さ優先探索

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

f p f
点 f の探索終了 : P(f) の検査

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)) は?

f f e
点 f から戻る : F と E の併合

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

slide40
点 e に戻った

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

slide41
点 e の探索終了

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

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)) は?

e e b
点 e から戻る : E と B の併合

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

slide43
根 b に戻り

木 T

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

b

b

d

c

e

f

a

h

全探索終了

g

slide44

アルゴリズムの記述と計算量

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

slide45
アルゴリズムの概要
  • 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 ) を呼ぶ.
slide46
アルゴリズムの概要
  • voidDFS( 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( )

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

slide48
アルゴリズムの計算量
  • どの点も高々 1 回しか訪問しない
    • 点 v に関する下記の操作は 1 回しか実行しない
  • 各点における操作
    • Merge の操作
    • 質問点対があれば,Find の操作
    • 子を順に探索するための操作
  • 全 Merge 回数: n-1 回 (n : 点の個数)
  • 全 Find 回数:   m 回 (m : 質問点対の個数)
  • 全計算量
    • O( 全 Merge の計算量 + 全 Find の計算量 + その他 )
    • = O( (n-1)・TM + m・TF + n )
merge find merge find

Merge-Find 集合とMerge-Find 木

Merge, Find に対する

効率的なデータ構造

merge find mf set
Merge-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 を作る手続き
merge find
Merge-Find 木

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

: 集合名

: 要素

merge c e c

C

e

c

C = { c, e }

Merge( C, E, C )

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

d

Merge の計算量 : TM = O(1)

find d
Find( d )

MF 木 U

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

merge c f f

F

f

e

c

F

e

F = { c, e, f }

Find の手間が小さくなるので,

好ましい

c

f

Merge( C, F, F )

C

F

B = { a, b, d, g, h }

C = { c, e }

F = { f }

e

f

c

?

merge

Merge 操作の改良

木の高さを抑える

Find の効率化になる

merge a b c
Merge( A, B, C )

C

A

B

a

a

b

b

|A| > |B|

要素数の少ない木の根を,

もう一方の木の根の子にする

要素数が n の木の

高さは,常に O(logn)

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

slide57
命題
  • 点の個数の少ない方の木の根を,

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

Merge を行うと,

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

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

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

slide58
数学的帰納法で証明
  • 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) は

slide59
数学的帰納法で証明

C

  • 一方,木 C の高さ h(C) は,

h(C) = max[ h(A), h(B)+1 ]

であるから,

    • 一般性を失うことなく,

|A|  |B| と仮定できる.

a

h(A)

b

A

h(B)

B

Q.E.D.

slide60

Find 操作の改良

木の高さを抑える

後の Find の効率化になる

均し計算量

slide61
Find の改良
  • 最下位共通先祖のアルゴリズムの計算量

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

= O( (n-1) + m・logn + n ) = O( m・logn + n )

  • 全 Find の計算量 O( m・logn ) の削減

道の圧縮(path compression)

slide62

B

a

b

c

g

x

f

d

e

Find の改良 (道の圧縮)
  • Find の操作において辿った点を

全て木の根の子にする操作

B

a

a

b

g

g

c

f

c

e

Find(x)

d

x

x

slide63
Find の改良 (道の圧縮)
  • Find の最悪計算量 TFのオーダは変化なし

B

B

a

a

a

b

g

g

b

c

g

x

c

f

c

e

Find(x)

f

d

e

d

x

x

slide64
Find の改良 (道の圧縮)
  • O(m・logn) から O(m・α(n) )になる
  • ここで, α(n) はアッカーマン(Ackerman)  関数の逆関数
  • しかし,全 Find 操作に要する総計算量 O(m・TF) は
ackermann s function
Ackermann’s Function
  • アッカーマン関数
slide66
アッカーマン関数の逆関数
  • pseudo-inverse function of Ackermann’s function
slide67
アッカーマン関数の逆関数
  • アッカーマン(Ackerman)関数の逆関数  α(n) は
  • n < 216なる n に対して, α(n) ≦ 3
  • 216 ≦ n <265,536   なる n に対して,

α(n) = 4 なので

  • 実用上,定数 O(1) と考えても良い.
slide68
均し計算量
  • 均し計算量(amortized time complexity)
  • ある操作 A の均し計算量とは,
  • A が何回か繰返された時,
  • その最悪総計算量を, 繰返し回数で割った 操作 A の 1 回当たりの計算量
slide69
均し計算量
  • MF 木の Find 操作に関しては,
  • Merge と Find がどのような順序で行われても,
  • m 回の Find に要する総計算量は,高々 O( m・α(n) ) なので,
  • Find 1回当たりの計算量(均し計算量)は
  • O(α(n) )
slide70
均し計算量
  • 最下位共通先祖を求めるアルゴリズムを  効率化するには,
  • Find の最悪計算量を小さくするのではなく
  • 全 Find に要する総計算量を 小さくしなければならない
  • すなわち,Find の均し計算量を小さくすれば良い
slide71
均し計算量
  • 最悪計算量を小さくするデータ構造は,  しばしば,複雑で,実際の計算時間が長い
  • 均し計算量を小さくするデータ構造は,  単純で,実際の計算時間も小さくなる  ことが多い
  •  このため,均し計算量は, 

データ構造を考える上での重要な概念

slide72

データ構造の詳細

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

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

parent

MF 木の点用のセル

set_name

size

MF 木のデータ構造
  • MF 木の根が持つべきデータ
    • set_name: その木が表す集合の名称 U(・)
    • size :    その木に含まれる要素の個数
  • MF 木の点が持つべきデータ
    • parent: その点の親(根まで辿れるように)
merge find1
Merge-Find 木

MF 木 U

U(b)

U(c)

U(f)

U(b)

U(c)

U(f)

a

e

f

b

5

c

2

f

5

g

h

b

c

d

根には,集合名 U(v) の

v だけを書いておく

slide76

木 T の点用のセル

mark

U(・)

P(・)

lm_child

Mfnode(・)

r_sibling

木 T のデータ構造
  • 各点 v∈Vに対して
    • lm_child(v) :長男のセルへのポインタ
    • r_sibling(v) :次弟のセルへのポインタ
    • mark(v) :未探索,探索中,探索済みの印
    • 集合 P(v) :連結リストへのポインタ
    • 集合 U(v) : MF 木の根のセルへのポインタ
    • MF点 MFnode(v) : MF 木内の点のセルへのポインタ
slide77

mark

U

P(・)

LmC

Mfn

RSb

c

h

e

f

M

M

M

M

M

M

M

M

U

U

U

U

U

U

U

U

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

e

f

c

h

g

h

f

g

g

h

P(・) 用のセル :

g

h

木 T のデータ構造

木 T

b

d

c

e

f

a

h

g

slide78

M

M

M

M

M

M

M

M

U

U

U

U

U

U

U

U

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

M

M

U

U

Mfn

Mfn

木 T と MF 木との関連

b

d

d

c

e

f

a

h

g

g

MF 木

g

1

a

1

d

1

f

1

slide79

M

M

M

M

M

M

M

M

U

U

U

U

U

U

U

U

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

2

木 T と MF 木との関連

点 a に戻った時点

b

b

a

d

d

c

e

g

f

a

h

a

1

MF 木

g

g

1

d

1

f

1

slide80

M

M

M

M

M

M

M

M

U

U

U

U

U

U

U

U

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

2

木 T と MF 木との関連

点 a に戻った時点

d

b

b

a

d

d

c

e

g

f

a

h

a

1

MF 木

g

g

1

d

1

f

1

slide81

M

M

M

M

M

M

M

M

U

U

U

U

U

U

U

U

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

d

3

木 T と MF 木との関連

点 d に戻った時点

d

b

a

d

c

e

g

f

a

h

a

2

MF 木

g

g

1

d

1

f

1

slide82

M

M

M

M

M

M

M

M

U

U

U

U

U

U

U

U

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

d

3

木 T と MF 木との関連

点 d に戻った時点

d

b

a

d

c

e

g

f

a

h

a

1

MF 木

g

g

1

d

1

f

1

slide83

M

M

M

M

M

M

M

M

U

U

U

U

U

U

U

U

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

d

3

木 T と MF 木との関連

点 d に戻った時点

d

b

a

d

c

e

g

f

a

h

a

1

MF 木

g

g

1

d

1

f

1

slide84

M

M

M

M

M

M

M

M

U

U

U

U

U

U

U

U

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

木 T と MF 木との関連

点 h を深さ優先探索

d

b

a

h

d

c

e

g

f

a

h

d

3

MF 木

g

g

1

h

1

f

1

slide85

M

M

M

M

M

M

M

M

U

U

U

U

U

U

U

U

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

4

木 T と MF 木との関連

点 d に戻った時点

d

b

a

h

d

c

e

g

f

a

h

d

3

MF 木

g

g

1

h

1

f

1

slide86

M

M

M

M

M

M

M

M

U

U

U

U

U

U

U

U

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

Mfn

木 T と MF 木との関連

点 d に戻った時点

d

b

a

h

d

c

e

g

f

a

h

d

4

MF 木

g

g

1

f

1

slide87
まとめ
  • オフライン最下位共通先祖問題を例に,

MF 木と均し計算量の説明をした.

  • また,アルゴリズムの解析と実現についても触れた.
  • アルゴリズムが与えられたとき,ここで述べたような手順でデータ構造を構築できれば,単位を修得!!