Slide 1

Slide 1 text

P1
 ©Techouse All Rights Reserved
 UnionFind(素集合データ構造 )とは

Slide 2

Slide 2 text

P2
 ©Techouse All Rights Reserved
 UnionFindとは グループ分けを効率的に管理するデータ構造

Slide 3

Slide 3 text

P3
 ©Techouse All Rights Reserved
 UnionFindを用いると 例えば、フットサルのチーム分けなどを効率的に行える

Slide 4

Slide 4 text

P4
 ©Techouse All Rights Reserved
 UnionFindが提供する操作は次の 2種類だけ 1. 「まとめる」 
 2. 「判定」


Slide 5

Slide 5 text

P5
 ©Techouse All Rights Reserved
 ● n個の要素があるとする ● 最初、n個の要素は全て別々のグループ 1 2 3 4 5

Slide 6

Slide 6 text

P6
 ©Techouse All Rights Reserved
 操作1. 「まとめる」

Slide 7

Slide 7 text

P7
 ©Techouse All Rights Reserved
 2つのグループを 1つにまとめる 
 1 2 3 4 5

Slide 8

Slide 8 text

P8
 ©Techouse All Rights Reserved
 1 2 3 4 5 2つのグループを 1つにまとめる 


Slide 9

Slide 9 text

P9
 ©Techouse All Rights Reserved
 1 2 3 4 5 1 2 2つのグループを 1つにまとめる 


Slide 10

Slide 10 text

P10
 ©Techouse All Rights Reserved
 1 2 3 4 5 1 2 2つのグループを 1つにまとめる 


Slide 11

Slide 11 text

P11
 ©Techouse All Rights Reserved
 1 2 3 4 5 1 2 3 4 5 2つのグループを 1つにまとめる 


Slide 12

Slide 12 text

P12
 ©Techouse All Rights Reserved
 操作2. 「判定」

Slide 13

Slide 13 text

P13
 ©Techouse All Rights Reserved
 1 3 2 4 6 5 1と3 → true 1と2 → false 2つの要素が同じグループに属しているかを判定する 


Slide 14

Slide 14 text

P14
 ©Techouse All Rights Reserved
 おさらいすると

Slide 15

Slide 15 text

P15
 ©Techouse All Rights Reserved
 UnionFindは 「まとめる」「判定」 2種類の操作のみで グループ分けを行う

Slide 16

Slide 16 text

P16
 ©Techouse All Rights Reserved
 皆さんは「まとめる」「判定」の 2種類の操作で グループ分けを効率的に行えることを 直感的に理解できるはず

Slide 17

Slide 17 text

P17
 ©Techouse All Rights Reserved
 というのも これまで何度も UnionFindと 同じことをやってきている

Slide 18

Slide 18 text

P18
 ©Techouse All Rights Reserved
 例えば、フットサルのチーム分け

Slide 19

Slide 19 text

P19
 ©Techouse All Rights Reserved
 チーム分けを抽選やグーチョキパー で決めたら

Slide 20

Slide 20 text

P20
 ©Techouse All Rights Reserved
 手当たり次第、 「あなたはどのチームですか?」 と周りの人に質問しますよね

Slide 21

Slide 21 text

P21
 ©Techouse All Rights Reserved
 これが、UnionFindの「判定」です

Slide 22

Slide 22 text

P22
 ©Techouse All Rights Reserved
 「判定」の結果、 同じチームであることが分かったら その人と一緒に固まりますよね?

Slide 23

Slide 23 text

P23
 ©Techouse All Rights Reserved
 これが、「まとめる」です

Slide 24

Slide 24 text

P24
 ©Techouse All Rights Reserved
 これで小グループができていきます

Slide 25

Slide 25 text

P25
 ©Techouse All Rights Reserved
 小グループの誰かが、別グループの誰かと話して (=判定) 同じグループであることが分かった場合、 二つのグループでまとまって より大きな 1つのグループとして固まりますよね

Slide 26

Slide 26 text

P26
 ©Techouse All Rights Reserved
 UnionFindの仕組みは、これと同じです

Slide 27

Slide 27 text

P27
 ©Techouse All Rights Reserved
 では、具体的にどう実現するか

Slide 28

Slide 28 text

P28
 ©Techouse All Rights Reserved
 グループを木構造で扱います

Slide 29

Slide 29 text

P29
 ©Techouse All Rights Reserved
 木構造とは

Slide 30

Slide 30 text

P30
 ©Techouse All Rights Reserved
 根 root 節 node 節 node 葉 reaf 葉 reaf 葉 reaf 葉 reaf ● 階層を持ったデータ構造 ● 1つの親から複数の子がぶら下 がるような構造

Slide 31

Slide 31 text

P31
 ©Techouse All Rights Reserved
 1 3 2 4 6 5 7

Slide 32

Slide 32 text

P32
 ©Techouse All Rights Reserved
 2 4 6 5 1 3 7

Slide 33

Slide 33 text

P33
 ©Techouse All Rights Reserved
 2 4 6 5 5 1 3 2 4 6 1 3 7 7

Slide 34

Slide 34 text

P34
 ©Techouse All Rights Reserved
 2 4 6 5 5 1 3 2 4 6 各ノード(要素)は親を1つ持つ 1 3 7 7

Slide 35

Slide 35 text

P35
 ©Techouse All Rights Reserved
 1 3 2 4 6 5 5 1 3 2 4 6 各ノード(要素)は親を1つ持つ 3の親 4と6の親 5自身の親 7 7の親

Slide 36

Slide 36 text

P36
 ©Techouse All Rights Reserved
 「まとめる」操作をどう実現するか

Slide 37

Slide 37 text

P37
 ©Techouse All Rights Reserved
 「まとめる」操作をどう実現するか 片方の根からもう片方の根に 辺(リンク)を張れば良い

Slide 38

Slide 38 text

P38
 ©Techouse All Rights Reserved
 1 2 1 3 6 2 4

Slide 39

Slide 39 text

P39
 ©Techouse All Rights Reserved
 1 2 1 3 6 2 4

Slide 40

Slide 40 text

P40
 ©Techouse All Rights Reserved
 1 2 1 1 3 6 2 4

Slide 41

Slide 41 text

P41
 ©Techouse All Rights Reserved
 1 2 1 2 1 3 6 2 4

Slide 42

Slide 42 text

P42
 ©Techouse All Rights Reserved
 1 2 1 3 6 2 4 1 2

Slide 43

Slide 43 text

P43
 ©Techouse All Rights Reserved
 1 2 1 3 6 2 4 1 2 6 2 4

Slide 44

Slide 44 text

P44
 ©Techouse All Rights Reserved
 1 2 1 3 6 2 4 1 2 6 2 4 1 3

Slide 45

Slide 45 text

P45
 ©Techouse All Rights Reserved
 「判定」操作をどう実現するか

Slide 46

Slide 46 text

P46
 ©Techouse All Rights Reserved
 「判定」操作をどう実現するか 2つの要素の親をたどり、 根が同じかどうかを見れば良い

Slide 47

Slide 47 text

P47
 ©Techouse All Rights Reserved
 1 3 6 2 4 5 7 5と7が同じグループか「判定」する

Slide 48

Slide 48 text

P48
 ©Techouse All Rights Reserved
 1 3 6 2 4 5 7 5と7が同じグループか「判定」する 5の親を辿っていく

Slide 49

Slide 49 text

P49
 ©Techouse All Rights Reserved
 1 3 6 2 4 5 7 5と7が同じグループか「判定」する 5の親を辿っていく 親

Slide 50

Slide 50 text

P50
 ©Techouse All Rights Reserved
 1 3 6 2 4 5 7 5と7が同じグループか「判定」する 5の親を辿っていく 親 親

Slide 51

Slide 51 text

P51
 ©Techouse All Rights Reserved
 1 3 6 2 4 5 7 5と7が同じグループか「判定」する 5の親を辿っていく 根 親 親

Slide 52

Slide 52 text

P52
 ©Techouse All Rights Reserved
 1 3 6 2 4 5 7 5と7が同じグループか「判定」する 5の根 => 1 根 親 親

Slide 53

Slide 53 text

P53
 ©Techouse All Rights Reserved
 1 3 6 2 4 5 7 5と7が同じグループか「判定」する 5の根 => 1 7の親を辿っていく 根

Slide 54

Slide 54 text

P54
 ©Techouse All Rights Reserved
 1 3 6 2 4 5 7 5と7が同じグループか「判定」する 5の根 => 1 7の親を辿っていく 根 親

Slide 55

Slide 55 text

P55
 ©Techouse All Rights Reserved
 1 3 6 2 4 5 7 5と7が同じグループか「判定」する 5の根 => 1 7の親を辿っていく 根 親 親

Slide 56

Slide 56 text

P56
 ©Techouse All Rights Reserved
 1 3 6 2 4 5 7 5と7が同じグループか「判定」する 5の根 => 1 7の親を辿っていく 根 親 親 根

Slide 57

Slide 57 text

P57
 ©Techouse All Rights Reserved
 1 3 6 2 4 5 7 5と7が同じグループか「判定」する 5の根 => 1 7の根 => 2 根 親 親 根

Slide 58

Slide 58 text

P58
 ©Techouse All Rights Reserved
 1 3 6 2 4 5 7 5と7は所属する木 (グループ)の 根(代表元)が一致しない 根 根

Slide 59

Slide 59 text

P59
 ©Techouse All Rights Reserved
 1 3 6 2 4 5 7 5と7は所属する木 (グループ)の 根(代表元)が一致しない つまり、別グループである 根 根

Slide 60

Slide 60 text

P60
 ©Techouse All Rights Reserved
 1 3 6 2 4 5 7 逆に、例えば 4と7は根が2で一致するので同一グループだと分かる 根 根