CS/Algorithm
์๋ก์ ์งํฉ(Disjoint-set)
deo2kim
2020. 9. 29. 20:55
๋ฐ์ํ
๐ ์๋ก์ ์งํฉ(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) ํน์ง
- ํฉ์งํฉ์ ์ฐพ์ ๋ ์ฌ์ฉ
- ์ฌ๋ฌ ๊ฐ์ ๋ ธ๋๊ฐ ์กด์ฌํ ๋ ๋๊ฐ์ ๋ ธ๋๋ฅผ ์ ํํด์, ์ ํํ ๋ ๋ ธ๋๊ฐ ์๋ก ๊ฐ์ ๊ทธ๋ํ์ ์ํ๋ ์ง ํ๋ณํ๋ ์๊ณ ๋ฆฌ์ฆ
๋ฐ์ํ