SlideShare a Scribd company logo
1 of 29
Download to read offline
素集合データ構造
(Union-Find木)
Union-Find木
●互いに交わらない集合(素集合)の族を扱うデー
タ構造
●各集合に「代表」と呼ばれる要素を決めておく
●代表が違う⇔集合が違う
●Union-Find木は2つの操作ができる
●集合の要素からその集合の代表を求める(Find)
●2つの集合を合併する(Union)
Find
4
59
10
1
7 11
63
12 2
8
13
代表
Find
4
59
10
1
7 11
63
12 2
8
13
代表
Find
4
59
10
1
7 11
63
12 2
8
13
代表
Find
4
59
10
1
7 11
63
12 2
8
13
代表
Find
4
59
10
1
7 11
63
12 2
8
13
代表
Find
4
59
10
1
7 11
63
12 2
8
13
代表
4の属する集合と8の属する集合は違う!
Union
4
59
10
1
7 11
63
12 2
8
13
代表
Union
4
59
10
1
7 11
63
12 2
8
13
代表
Union
4
59
10
1
7
11
6
3
12
2
8
13
代表
Union-Find木の実装
●それぞれの集合を根付き木で表す
●代表を根にする
1
5 2
6 3
79
10
11
12
134 8
Find
●親を辿って根を見る
1
5 2
6 3
79
10
11
12
134 8
Find
●親を辿って根を見る
1
5 2
6 3
79
10
11
12
134 8
Find
●親を辿って根を見る
1
5 2
6 3
79
10
11
12
134 8
Find
●親を辿って根を見る
1
5 2
6 3
79
10
11
12
134 8
Union
●一方をもう一方の代表の子にする
1
5 2
6 3
79
10
11
12
134 8
Union
●一方をもう一方の代表の子にする
1
5 2
6 3
7
9
10
11
12
134 8
Union-Find木の計算量
●このままだと最悪計算量は
●Find
●Union
●Findに時間がかかりすぎる
●2種類の高速化法がある
…
O(n)
O(1)
高速化その1:rank
●それぞれの木に  と呼ばれる数値をつける
●要素1個の時
●   同士の木を合併したら    になる
●  が違う木同士を合併するときは、  の高
い方に低い方を合併し、  は  の高い方の
  にする
●   の木の高さは高々 k
rank
rank 0
rank k rank k+1
rank rank
rank k
rank rank
rank
高速化その1:rank
1
5 2
6 3
79
10
11
12
134 8
rank 2
rank 2
rank 1
rank 1
高速化その1:rank
1
5 2
6 3
79
10
11
12
134 8
rank 2
rank 2
rank 1
rank 1
高速化その1:rank
1
5 2
6 3
7
9
10
11
12
134 8
rank 2
rank 2
rank 1
高速化その1:rank
●   の木を作るには少なくとも 個の要素が
必要⇒    の木を作るには最低でも  個
の要素が必要(数学的帰納法)
●要素 個のUnion-Find木は高々
●要素 個のUnion-Find木の高さは高々
●最悪計算量は
●Find
●Union
rank k 2k
rank k+1 2k+1
n rank⌊log2(n)⌋
n ⌊log2(n)⌋
O(log(n))
O(1)
高速化その2:経路圧縮
●Findするときに、根を親にしてしまう
●ついでに根にたどり着くまでの先祖の親も根にして
しまう
●重要なのは根の情報だけだからこれで問題ない
高速化その2:経路圧縮
1
5 2
6 3
7
9
10
11
12
13
4 8
高速化その2:経路圧縮
1
5 2
6 3
7
9
10
11
12
13
4 8
高速化その2:経路圧縮
1
5
2
6 3
79
10
11
12
13
4
8
高速化その2:経路圧縮
●最悪計算量(ならし)
●Find
●Union
●高速化その1と組み合わせることもできる
●経路圧縮しても  は再計算しない
●Find
●Union
●   はアッカーマン関数の逆関数、実質定数
O(log(n))
O(1)
O(α(n))
O(1)
rank
α(n)

More Related Content

What's hot

指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端
Yoichi Iwata
 
Divisor
DivisorDivisor
Divisor
oupc
 

What's hot (20)

指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
 
LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
 
AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
 
双対性
双対性双対性
双対性
 
AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説
 
部内勉強会 数え上げの基礎
部内勉強会 数え上げの基礎部内勉強会 数え上げの基礎
部内勉強会 数え上げの基礎
 
強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp
強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp
強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)
 
AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題
 
AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説
 
AtCoder Regular Contest 028 解説
AtCoder Regular Contest 028 解説AtCoder Regular Contest 028 解説
AtCoder Regular Contest 028 解説
 
指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端
 
AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
辺彩色
辺彩色辺彩色
辺彩色
 
Divisor
DivisorDivisor
Divisor
 

Viewers also liked (7)

AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組み
 
幾何コンテスト2013
幾何コンテスト2013幾何コンテスト2013
幾何コンテスト2013
 
AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
 
TCO2017R1
TCO2017R1TCO2017R1
TCO2017R1
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
 
深さ優先探索による塗りつぶし
深さ優先探索による塗りつぶし深さ優先探索による塗りつぶし
深さ優先探索による塗りつぶし
 

More from 京大 マイコンクラブ

More from 京大 マイコンクラブ (20)

テキストファイルを読む💪 第1回
テキストファイルを読む💪  第1回テキストファイルを読む💪  第1回
テキストファイルを読む💪 第1回
 
かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話
 
Common Lisp入門
Common Lisp入門Common Lisp入門
Common Lisp入門
 
多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
Geometry with Unity
Geometry with UnityGeometry with Unity
Geometry with Unity
 
セミコロンレスc++
セミコロンレスc++セミコロンレスc++
セミコロンレスc++
 
エンジニアと健康
エンジニアと健康エンジニアと健康
エンジニアと健康
 
女の子になれなかった人のために
女の子になれなかった人のために女の子になれなかった人のために
女の子になれなかった人のために
 
Pietで競プロしよう
Pietで競プロしようPietで競プロしよう
Pietで競プロしよう
 
もし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったらもし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったら
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会
 
No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)
 
DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」
 
hideya流 テストプレイ観察術
hideya流 テストプレイ観察術hideya流 テストプレイ観察術
hideya流 テストプレイ観察術
 
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編
 
Altseed
AltseedAltseed
Altseed
 
C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回
 

素集合データ構造