๋ฐ์ํ
๐ ์๋ก์ ์งํฉ(Disjoint-set) ์ด๋
- ์๋ก์ ๋๋ ์ํธ๋ฐฐํ ์งํฉ๋ค์ ์๋ก ์ค๋ณต ํฌํจ๋ ์์๊ฐ ์๋ ์งํฉ๋ค( ๊ต์งํฉ์ด ์๋ ์ํ )
- ์งํฉ์ ์ํ ํ๋์ ํน์ ์์๋ฅผ ํตํด ๊ฐ๊ฐ์ ์งํฉ๋ค์ ๊ตฌ๋ถ ( ์ด๋ฅผ ๋ํ์๋ผ๊ณ ํจ )
- ์ํธ ๋ฐฐํ ์งํฉ์ ํํํ๋ ๋ฐฉ๋ฒ
- ์ฐ๊ฒฐ ๋ฆฌ์คํธ
- ๊ฐ์ ์งํฉ์ ์์๋ค์ ํ๋์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ด๋ฆฌ
- ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋งจ ์์ ์์๋ฅผ ์งํฉ์ ๋ํ๋ก ํ๋ค
- ๊ฐ ์์๋ ์งํฉ์ ๋ํ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ๋งํฌ๋ฅผ ๊ฐ๋๋ค
- ํธ๋ฆฌ
- ํ๋์ ์งํฉ์ ํธ๋ฆฌ๋ก ํํ
- ์์ ๋ ธ๋๊ฐ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ฉฐ ๋ฃจํธ ๋ ธ๋๊ฐ ๋ํ์๊ฐ ๋จ
- ์ฐ๊ฒฐ ๋ฆฌ์คํธ
- ์ํธ๋ฐฐํ ์งํฉ ์ฐ์ฐ
- make_set(x)
- find_set(x)
- union(x,y)
๐ ์๋ก์ ์งํฉ(Disjoint-set) ๊ตฌํ
def make_set(x):
p[x] = x
def find_set(x):
if p[x] == x:
return x
else:
p[x] = find_set(p[x])
return p[x]
def union(x, y):
# a์ b์ ๋ํ์๋ฅผ ์ฐพ์
px = find_set(x)
py = find_set(y)
if rank[px] > rank[py]:
p[py] = px
elif rank[py] > rank[px]:
p[px] = py
else:
p[px] = py
rank[py] += 1
# 1๋ถํฐ 8๊น์ง ํด๋ณด์
n = 8
p = [0] * (n + 1)
rank = [0] * (n + 1)
for i in range(1, n + 1):
make_set(i)
union(1, 3)
union(2, 3)
union(5, 6)
union(6, 8)
union(1, 5)
union(6, 7)
print(p)
print(find_set(4))
print(find_set(5))
# ์ฐ์ฐ์ ํจ์จ์ ๋์ด๋ ๋ฐฉ๋ฒ
# 1. path compression: ๋ชจ๋ ๋
ธ๋๋ค์ด ์ง์ root๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ๊ฐฑ์ ํ๋ค.
# 2. Rank๋ฅผ ์ด์ฉํ Union: ๊ฐ ๋
ธ๋๋ ์์ ์ ๋ฃจํธ๋ก ํ๋ subtree์ ๋์ด๋ฅผ Rank๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅํ๋ค.
# 2-2. ๋ ์งํฉ์ ํฉ์น ๋ rank๊ฐ ๋ฎ์ ์งํฉ์ rank๊ฐ ๋์ ์งํฉ์ ๋ถ์ธ๋ค.
๐ ์๋ก์ ์งํฉ(Disjoint-set) ํน์ง
- ํฉ์งํฉ์ ์ฐพ์ ๋ ์ฌ์ฉ
- ์ฌ๋ฌ ๊ฐ์ ๋ ธ๋๊ฐ ์กด์ฌํ ๋ ๋๊ฐ์ ๋ ธ๋๋ฅผ ์ ํํด์, ์ ํํ ๋ ๋ ธ๋๊ฐ ์๋ก ๊ฐ์ ๊ทธ๋ํ์ ์ํ๋ ์ง ํ๋ณํ๋ ์๊ณ ๋ฆฌ์ฆ
๋ฐ์ํ
'CS > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ค์ด๋๋ฏนํ๋ก๊ทธ๋๋ฐ(Dynamic Programming) (0) | 2020.10.01 |
---|---|
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ(kruskal) (0) | 2020.09.30 |
๊น์ด ์ฐ์ ํ์(Depth First Search, DFS) (0) | 2020.09.28 |
๋๋น ์ฐ์ ํ์(Breath First Search, BFS) (0) | 2020.09.27 |
๊ณ์ ์ ๋ ฌ(counting sort) (0) | 2020.09.26 |