Notice
Recent Posts
Recent Comments
Link
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- prim ์๊ณ ๋ฆฌ์ฆ
- ์ค์ ํ๊ธฐ๋ฒ
- ํ์ ํ๊ธฐ๋ฒ
- ์๊ณ ๋ฆฌ์ฆ
- ์ต์ ๋น์ฉ ์ ์ฅ ํธ๋ฆฌ
- union-find
- ์ด์งํ์ํธ๋ฆฌ
- ์ด์ง ๊ฒ์
- ์๋ก์ ์งํฉ
- disjoint-sets
- ๋์ ๊ณํ๋ฒ
- binary search
- ํ๋ก์ธ์ค์ ์ํ
- kruskal ์๊ณ ๋ฆฌ์ฆ
- BST
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
- quick-sort
- divide and conquer
- ์๋ฃ๊ตฌ์กฐ
- CPU scheduling
- merge-sort
- ํธ๋ฆฌ
- ๋ถ๋ถ ์งํฉ
- ์์ ํ์
- deque
- ํ๋ก์ธ์ค
- ํ์ ์๊ณ ๋ฆฌ์ฆ
- ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์
- 3190๋ฒ
- ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
Archives
- Today
- Total
Dionysus
[์๊ณ ๋ฆฌ์ฆ๐งฉ] Union-Find (Disjoint-sets) ๋ณธ๋ฌธ
๋ชฉ์ฐจ
๐ฌ ์๋ก์ ์งํฉ (Disjoint-sets)
๐ฌ ์๋ก์ ์งํฉ(Disjoint-sets)
๋๋ณด๊ธฐ






Find-Set(d) = Find-Set(e) = return c
๐ก ์๋ก์ ์งํฉ(Disjoint-sets)
์๋ก์ ๋๋ ์ํธ๋ฐฐํ ์งํฉ๋ค๋ก, ๊ต์งํฉ์ด ์๋ ์งํฉ๋ค์ ์๋ฏธํ๋ค.
์งํฉ์ ์ํ ํ๋์ ํน์ ๋ฉค๋ฒ๋ฅผ ํตํด ์งํฉ๋ค์ ๊ตฌ๋ถํ๋๋ฐ, ์ด๋ฅผ ๋ํ์(representative)๋ผ๊ณ ํ๋ค.
- ์ํธ๋ฐฐํ ์งํฉ ํํ ๋ฐฉ๋ฒ
- ์ฐ๊ฒฐ ๋ฆฌ์คํธ
- ํธ๋ฆฌ
- ์ํธ๋ฐฐํ ์งํฉ ์ฐ์ฐ
- Make - Set(x)
์ ์ผํ ๋ฉค๋ฒ x๋ฅผ ํฌํจํ๋ ์๋ก์ด ์งํฉ์ ์ฐ์ฐํ๋ ์ฐ์ฐ - Find - Set(x) return {representative}
x๋ฅผ ํฌํจํ๋ ์งํฉ์ ์ฐพ๋ ์ฐ์ฐ - Union(x, y)
x์ y๋ฅผ ํฌํจํ๋ ๋ ์งํฉ์ ํตํฉํ๋ ์ฐ์ฐ
- Make - Set(x)
๐ ์ํธ๋ฐฐํ ์งํฉ์ ์
โ ์ํธ ๋ฐฐํ ์งํฉ ํํ - ์ฐ๊ฒฐ๋ฆฌ์คํธ
๊ฐ์ ์งํฉ์ ์์๋ค์ ํ๋์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ด๋ฆฌํ๋ฉฐ, ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋งจ ์ ์์๊ฐ ๋ํ ์์(representative)๊ฐ ๋๋ค.- ๊ฐ ์์๋ ์งํฉ์ ๋ํ์์(representative)๋ฅผ ๊ฐ๋ฆฌํค๋ ๋งํฌ๋ฅผ ๊ฐ์ง๋ค.

- Find-Set(e) return a
- Find-Set(f) return b
- Union(a, b)

โ ์ํธ ๋ฐฐํ ์งํฉ ํํ - ํธ๋ฆฌ
ํ๋์ ์งํฉ(a disjoint set)์ ํ๋์ ํธ๋ฆฌ๋ก ํํํ๋ ๊ฒ์ด๋ค.
- ์์ ๋ ธ๋๊ฐ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ฉฐ ๋ฃจํธ ๋ ธ๋๊ฐ ๋ํ์(representative)๊ฐ ๋๋ค.

- Make-Set(a) ~ Make-Set(f)

- Union(c, d), Union(e, f)

- Union(d, f)


๐ ์ํธ ๋ฐฐํ ์งํฉ ์ฐ์ฐ(ํธ๋ฆฌ)์ ๋ฌธ์ ์
ํธ๋ฆฌ์ ํํ์ ์ฌ์ฉํ๋ฉด Union(x, y) ์ฐ์ฐ์ ์ํํ ๋ ๋ฃจํธ ํ๋์ ์ ๋ณด๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋ค๋ ์ฅ์ ์ ๊ฐ์ง๋ค. ๊ทธ๋ฌ๋ ์ฐ์ฐ์ ์์์ ๋ฐ๋ผ ์๋ชปํ๋ฉด ํธ๋ฆฌ๊ฐ ํ์ชฝ์ผ๋ก ๊ธฐ์ธ์ด์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
โท ํธ๋ฆฌ์ ๋์ด๊ฐ h๊ฐ ๋๋ฉด Union()์ฐ์ฐ๊ณผ Find-Set() ์ฐ์ฐ ๋ชจ๋ ์๊ฐ๋ณต์ก๋๊ฐ O(h)๊ฐ ๋์ด๋ฒ๋ฆฌ๋ฉฐ, ๋ฐฐ์ด๋ก ๊ตฌํํ๋ ๊ฒ๋ณด๋ค ํจ์จ์ด ๋ ๋๋น ์ง๋ค.
โถ ํด๊ฒฐ(์ต์ ํ) ๋ฐฉ์
- Rank๋ฅผ ํ์ฉํ Union (๋ญํฌ์ ์ํ ํฉ์น๊ธฐ ์ต์ ํ)
๊ฐ ๋ ธ๋๋ ์์ ์ ๋ฃจํธ๋ก ํ๋ subtree์ ๋์ด๋ฅผ ๋ญํฌ(rank)๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ์งํฉ์ ํฉ์น ๋ rank๊ฐ ๋ฎ์ ์งํฉ์ rank๊ฐ ๋์ ์งํฉ์ ๋ถ์ธ๋ค.p[x]: ๋ ธ๋ x์ ๋ถ๋ชจ ์ ์ฅ rank[x]: ๋ฃจํธ ๋ ธ๋๊ฐ x์ธ ํธ๋ฆฌ์ ๋ญํฌ ๊ฐ ์ ์ฅ Make_Set(x): p[x] = x rank[x] = 0 Find_Set(x): # x๊ฐ ๋ฃจํธ๊ฐ ์๋ ๊ฒฝ์ฐ if x != p[x]: p[x] = Find_Set(p[x]) return p[x] Union(x, y): Link(Find_Set(x), Find_Set(y)) Link(x, y): # rank๋ ํธ๋ฆฌ์ ๋์ด if rank[x] > rank[y]: p[y] = x else p[x] = y if rank[x] == rank[y]: rank[y] += 1
→ Find_Set() ์ฐ์ฐ์ ํน์ ๋ ธ๋์์ ๋ฃจํธ๊น์ง์ ๊ฒฝ๋ก๋ฅผ ์ฐพ์๊ฐ๋ฉด์ ๋ ธ๋์ ๋ถ๋ชจ ์ ๋ณด๋ฅผ ๊ฐฑ์ ํ๋ค.
- Path Compression (๊ฒฝ๋ก ์์ถ)
Find-Set์ ํํ๋ ๊ณผ์ ์์ ๋ง๋๋ ๋ชจ๋ ๋ ธ๋๋ค์ด ์ง์ root๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํฌ์ธํฐ๋ฅผ ๋ณ๊ฒฝํด์ค๋ค.