Disjoint Set์ด๋?
์๋ก ์ค๋ณต๋์ง ์์ ๋ถ๋ถ ์งํฉ๋ค๋ก ๋๋์ด์ง ์์๋ค์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์กฐ์ํ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
์ํธ ๋ฐฐํ์ ์ธ ๋ถ๋ถ ์งํฉ๋ค๋ก ๋๋ ์ง ์์๋ค์ ๋ํ ์๋ฃ๊ตฌ์กฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
ํํ ์๋ก์ ์งํฉ ์๋ฃ๊ตฌ์กฐ ๋ผ๊ณ ๋ ํ๋ค.
Union-Find ๋?
Union-Find๋ ์๋ก์ ์งํฉ์ ํํํ ๋ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์งํฉ์ ํํํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ฐฐ์ด, ์ฐ๊ฒฐ๋ฆฌ์คํธ ๋ฑ์ ์ด์ฉํ ์ ์๋ค. ๊ทธ ์ค ๊ฐ์ฅ ํจ์จ์ ์ธ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ๋ค.
๋ณดํต MST์ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์์ ์ฌ์ฉ๋๋ค.
ํธ๋ฆฌ๋ฅผ ์ด์ฉํ ์งํฉ์ ์ฒ๋ฆฌ
- ๊ฐ์ ์งํฉ์ ์์๋ค์ ํ๋์ ํธ๋ฆฌ๋ก ๊ด๋ฆฌํ๋ค. (์์ ๋ ธ๋๊ฐ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํด)
- ํธ๋ฆฌ์ ๋ฃจํธ๋ฅผ ์งํฉ์ ๋ํ ์์๋ก ์ผ๋๋ค.
Union-Find ์ฐ์ฐ
- Make-Set(x) : ์์ x๋ก๋ง ์ด๋ฃจ์ด์ง ์งํฉ์ ๋ง๋ ๋ค. - ์ด๊ธฐํ
- Find-Set(x) : ์์ x๋ฅผ ๊ฐ์ง๊ณ ์๋ ์งํฉ์ ์์๋ธ๋ค. (์ฐพ๋๋ค) - ์ฐพ๊ธฐ
- Union(x, y) : ์์ x๋ฅผ ๊ฐ์ง ์งํฉ๊ณผ ์์ y๋ฅผ ๊ฐ์ง ์งํฉ์ ํฉ์งํฉ - ํฉํ๊ธฐ
ํธ๋ฆฌ๋ฅผ ์ด์ฉํ ์งํฉ ์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ
Make-Set(x)
{
p[x] = x;
}
Union(x, y)
{
p[Find-Set(y)] = Find-Set(x);
}
Find-Set(x)
{
if(x=p[x])
then return x;
else return Find-Set(p[x]);
}
Union-Find ๊ณผ์
Union-Find ๊ธฐ๋ณธ ์ฝ๋
parents = [i for i in range(SIZE)]
def find(parent, x):
if parent[x] == x:
return x
else: #๋ถ๋ชจ ์ฐพ๊ธฐ
return find(parent, parent[x])
def union(parent, x, y):
# ๊ฐ ์์๊ฐ ์ํ ํธ๋ฆฌ์ ๋ฃจํธ ๋
ธ๋๋ฅผ ์ฐพ๊ธฐ.
fX = find(parent, x)
fY = find(parent, y)
parent[fY] = fX
Union-Find ์ฐ์ฐ ํจ์จ ๋์ด๋ ๋ฐฉ๋ฒ
๋ญํฌ๋ฅผ ์ด์ฉํ Union
- ๊ฐ ๋ ธ๋๋ ์์ ์ ๋ฃจํธ๋ก ํ๋ ์๋ธํธ๋ฆฌ์ ๋์ด๋ฅผ ๋ญํฌ Rank ๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅํ๋ค.
- ๋ ์งํฉ์ ํฉ์น ๋ ๋ญํฌ๊ฐ ๋ฎ์ ์งํฉ์ ๋ญํฌ๊ฐ ๋์ ์งํฉ์ ๋ถ์ธ๋ค.
๊ฒฝ๋ก ์์ถ
- Find-Set์ ํํ๋ ๊ณผ์ ์์ ๋ง๋๋ ๋ชจ๋ ๋ ธ๋๋ค์ด ์ง์ ๋ฃจํธ๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํฌ์ธํฐ๋ฅผ ๋ฐ๊พผ๋ค.