์งํฉ์ ์ฒ๋ฆฌ
์ํธ ๋ฐฐํ์ ์ธ ์ฌ๋ฌ ๊ฐ์ ์งํฉ์ ์ฒ๋ฆฌํด์ผ ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ ์ต์ ์ ์ฅ ํธ๋ฆฌ
๋ฅผ ์ํ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ
์์ ์ํธ ๋ฐฐํ์ ์ธ ์งํฉ์ ์ฒ๋ฆฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ํ์ํ๋ค.
์งํฉ์ ๊ด๋ฆฌ์์ ํ์ํ ์ฐ์ฐ์ ์์์ ์์๊ฐ ์ด๋ ์งํฉ์ ์ํ๋์ง ์๋๋ด๋ ์ฐ์ฐ๊ณผ ๋ ์งํฉ์ ํฉํ๋ ์ฐ์ฐ์ด๋ค.
์ฌ๊ธฐ์ ๋ง ํ๋ ์ํธ ๋ฐฐํ์ ์ธ ์งํฉ์ ์๋ก์ ๊ต์งํฉ์ด ๊ณต์งํฉ์ธ ๊ฒฝ์ฐ๋ฅผ ๋ปํ๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ ์งํฉ์ ์ฒ๋ฆฌ
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ ํํ์ ์ฝ๊ณ ์ง๊ด์ ์ด๋ค. ++๊ฐ ์์๋น ํ๋์ ๋ ธ๋๋ฅผ ๋ง๋ค๊ณ ์ด๋ค์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ์ฐ๊ฒฐํ๋ค++
๋ ธ๋๋ ๋ ๊ฐ์ ํฌ์ธํฐ์ ์์๋ฅผ ๊ฐ๋ ํ ๊ฐ์ ํ๋๋ก ์ด๋ฃจ์ด ์ง๋ค.
๋ค์ ์์ ํฌ์ธํฐ -> ๋ค์ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ. ๊ฐ ์งํฉ์๋ ๋ง์ง๋ง ์์๋ฅผ ๊ฐ๋ฆฌํค๋
tail
์ด๋ผ๋ ๋ณ์๋ฅผ ๋๋ค.
๋ํ ์์ ํฌ์ธํฐ -> ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋งจ ์์ ์๋ ์์.
)
์ํธ ๋ฐฐํ์ ์งํฉ์ ๊ด๋ฆฌ๋ฅผ ์ํด ํ์ํ ++์ธ ๊ฐ์ง ์ฐ์ฐ++
Make-Set(x)
- ์์ x๋ก๋ง ๊ตฌ์ฑ๋ ์งํฉ์ ๋ง๋ ๋ค.
Find-Set(x)
- ์์ x๋ฅผ ๊ฐ์ง ์งํฉ์ ์์๋ธ๋ค.
Union(x, y)
- ์์ x๋ฅผ ๊ฐ์ง ์งํฉ๊ณผ ์์ y๋ฅผ ๊ฐ์ง ์งํฉ์ ํ๋์ ์งํฉ์ผ๋ก ํฉ์น๋ค.
์์ ์ ๊ฐ์
์ค์ ์ ์ผ๋ก ์ฐ์ฐ์ ํด๋ณด์.
์ฐ๊ฒฐ ๋ฆฌ์คํธ ์งํฉ a์ a = {a,b,c}
์ฐ๊ฒฐ ๋ฆฌ์คํธ ์งํฉ b๋ฅผ ํฉ์น๋ค๊ณ ํ์! b = {d,e,f,g,h}
-
Union(a, b);
Union์ด ์ด๋ฃจ์ด์ง๋ค๋ฉด. ๋ํ ์์๋ฅผ ๋ฐ๊ฟ์ ์ด์ด์ค๋ค.
์ด๋ ๊ฒ ํ๋ ฌ a = {a,b,c}
์ ๋ํ ์์๋ฅผ a
๊ฐ ์๋ d
๋ก ์ฐ๊ฒฐ์ ์์ผ์ค๋ค.
๋ฌด๊ฒ๋ฅผ ๊ณ ๋ คํ Union^Weighted_Union^
์ฐ๊ฒฐ ๋ฆฌ์คํธ ํํ์์ Make-Set
์ ํ๋์ ์์๋ก ๋ ์งํฉ์ ์ด๊ธฐํํ๋ ๊ฒ์ด๋ฏ๋ก ์์ ์๊ฐ์ด ๋ ๋ค. ๋ํ Find-Set
๋ ์์ ์๊ฐ์ด ๋๋๋ฐ, ์ด ์ค ์์ ์๊ฐ์ ์ด๊ณผํ๋ ๊ฒ์ Union
๋ฟ์ด๋ค.
ํฌ๊ธฐ๊ฐ ๋ค๋ฅธ ๋ ์งํฉ์ด ์๋ค๊ณ ํ์.
A = {1, 3, 5}
B = {2, 4, 6, 8, 10}
Union(A, B)
๋ฅผ ํ์ ๋ ๋ํ ์์๋ฅผ ๋๋ ๊ฒฝ์ฐ๋ ๋ ๊ฐ์ง๊ฐ ์๋ค.
- A์ ๋ํ ์์๋ฅผ ๋ฐ๊พธ๋ ๊ฒฝ์ฐ.
- B์ ๋ํ ์์๋ฅผ ๋ฐ๊พธ๋ ๊ฒฝ์ฐ.
1๋ฒ ๊ฐ์ ๊ฒฝ์ฐ๋ 1, 3, 5์ ์์ง์ (3๋ฒ) , 2๋ฒ ๊ฐ์ ๊ฒฝ์ฐ๋ 2, 4, 6, 8, 10์ ์์ง์ (5๋ฒ)์ ์ฐจ์ด๊ฐ ์๋ค.
์ด๋ฐ ๋ฐฉ์์ผ๋ก ๋ ์งํฉ์ ํฉ์น๋ ๊ฒ์ ๋ฌด๊ฒ๋ฅผ ๊ณ ๋ คํ Union์ด๋ผ๊ณ ํ๋ค.
์ํ ์๊ฐ.
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํด ํํ๋๋ ๋ฐฐํ์ ์งํฉ์์ ๋ฌด๊ฒ๋ฅผ ๊ณ ๋ คํ Union์ ์ฌ์ฉํ ๋, M๋ฒ์ Make-Set, Union, Find-Set์ค n๋ฒ์ด Make-Set์ด๋ผ๋ฉด ์ด๋ค์ ์ด ์ํ ์๊ฐ์?
-
n๋ฒ์ Make-Set์ ํฌํจํ๋ฏ๋ก ์์์ ์ด ์๋ n๊ฐ๋ค.
-
Make-Set๊ณผ Find-Set์ ๊ฐ๊ฐ O(1)์ ์๊ฐ์ด ๋ค๊ณ ์ด๋ค์ ํฉํด๋ m๋ฒ์ ๋์ง ์์ผ๋ฏ๋ก ์ด๋ค๋ก ์ธํ ๋ถ๋ด์ O(m)์ด๋ค.
-
๊ฒฐ๊ตญ ๋ฌธ์ ๋ Union์ด๊ณ , Union์์ ์๊ฐ์ ๊ฒฐ์ ํ๋ ๊ฒ์ ๋ํ ๋ ธ๋๋ก ํฌ์ธํฐ๋ฅผ ๊ฐฑ์ ํ๋ ์์ ์ด๋ค.
Union์์ ์งํฉ์ x๋ผ๋ ๊ฐ์ด ์๋ค๊ณ ํ์, ์ด x๊ฐ์ ๋ํ Unionํจ์์ ์ํด์ ๋ง๋ค์ด ์ก์ผ๋ฏ๋ก ์์
Union(n/2, n/2)
์ด ๋๋ค. ๋ํ n/2๋Union(n/4, n/4)
๋ก ์ด๋ฃจ์ด ์ ธ ์ ์ 1 -> 2^2^ -> 2^3^ -> 2^4^ ์ ๋น์จ๋ก ์ปค์ง๋ค.
ํ์ง๋ง ์์์ ์ด ์๋ n์ด๋ฏ๋ก ๋ชจ๋ ์์๋ฅผ ๊ณ ๋ คํ๋ค๋ฉด ๊ธฐ๊ปํด์ผ nLog(2^n^)์ ๋์ง ์๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ ์ฒด ์๊ฐ์
O(m+nlogn) ์ด๋ค.
ํธ๋ฆฌ๋ฅผ ์ด์ฉํ ์งํฉ์ ์ฒ๋ฆฌ
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ Union
์์๋ ๊ฒฐ๊ตญ ๋ ๋ฒ์ ํฌ์ธํฐ ๊ฐฑ์ ์ด ํ์ํ๋ฐ ์ด ๋ง์ ๋ ํจ์จ์ ์ผ๋ก ํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก ํธ๋ฆฌ๋ฅผ ์ด์ฉํ ์งํฉ์ ์ฒ๋ฆฌ์ด๋ค.
๊ธฐ๋ณธ ์๋ฆฌ
ํธ๋ฆฌ๋ฅผ ์ด์ฉํ๋ค๋ฉด ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์์ ๊ฒ ์ฒ๋ผ ๋ ๋ฒ์ ๊ฐฑ์ ์ด ํ์ํ์ง ์๊ณ ๋จ์ง ๋ฃจํธ ๋
ธ๋์ ์์น๋ง ๋ฐ๊ฟ์ค๋ค๋ฉด ํ ๋ฒ์ Union
์ด ๊ฐ๋ฅํ๋ค.
ํธ๋ฆฌ๋ฅผ ์ด์ฉํ๋ ค๋ฉด ๋ ๊ฐ์ง์ ํน์ง์ ์์์ผ ํ๋ค.
ํธ๋ฆฌ์ ๋ ๊ฐ์ง ํน์ง
- ์์ ๋ ธ๋๊ฐ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
- ํธ๋ฆฌ์ ๋ฃจํธ๋ฅผ ์งํฉ์ ๋ํ ์์๋ก ์ผ๋๋ค.
์ง๊ด์ ์ธ ๊ทธ๋ฆผ์ผ๋ก ๋ณด์.
a๋ ์๊ธฐ ์์ ์ ๊ฐ๋ฆฌํค๊ณ ๋ฃจํธ ๋ ธ๋๊ฐ ๋๋ค.
c๋ ์๊ธฐ ์์ ์ ๊ฐ๋ฆฌํค๊ณ ๋ฃจํธ ๋ ธ๋๊ฐ ๋๋ฉฐ ์์ ๋ ธ๋ b์ h๊ฐ ํฅํ๊ณ ์๋ค.
ํธ๋ฆฌ์ Union
ํธ๋ฆฌ๋ฅผ ์ด์ฉํ ํํ์์ ๋ ์งํฉ์ ํฉ์น๋ ์์ ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ฐฉ๋ฒ ๋ณด๋ค ์์ฃผ ๊ฐ๋จํ๋ค.
๋ ์งํฉ ์ค ํ ์งํฉ์ ใ ํธ๊ฐ ๋ค๋ฅธ ์งํฉ์ ๋ฃจํธ๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํฌ์ธํฐ ํ๋๋ง ๋ณ๊ฒฝํด์ค๋ค๋ฉด ๋!
ํ๋์ ์์๋ก ๊ตฌ์ฑ๋ ์งํฉ์ ๋ ธ๋๋ฅผ ํ๋ ๋ง๋ค๊ณ ์ด ๋ ธ๋์ ๋ถ๋ชจ๊ฐ ์์ ์ด ๋๋๋ก ํฌ์ธํฐ๋ฅผ ๋ง๋ค์ด๋์ผ๋ฉด ๋๋ค.
// ๋ถ๋ชจ ๋
ธ๋ : p[x]
// ๋
ธ๋ x๋ฅผ ์ ์ผํ ์์๋ก ํ๋ ์งํฉ์ ๋ง๋ ๋ค.
Make_Set(x){
p[x] <- x;
}
// ๋
ธ๋ x๊ฐ ์ํ ์งํฉ๊ณผ ๋
ธ๋ y๊ฐ ์ํ ์งํฉ์ ํฉ์น๋ค.
Union(x, y){
p[Find_Set(y)] <- Find_Set(x);
}
// ๋
ธ๋ x๊ฐ ์ํ ์งํฉ์ ์์๋ธ๋ค. ๋
ธ๋ x๊ฐ ์ํ ํธ๋ฆฌ์ ๋ฃจํธ ๋
ธ๋๋ฅผ ๋ฆฌํดํ๋ค.
Find_Set(x){
if(x=p[x]) then return x;
else return Find_Set(p[x])
}
์ฐ์ฐ์ ํจ์จ์ ๋์ด๋ ๋ฐฉ๋ฒ
๋ญํฌ๋ฅผ ์ด์ฉํ Union
- ๊ฐ ๋ ธ๋๋ ์์ ์ ๋ฃจํธ๋ก ํ๋ ์๋ธํธ๋ฆฌ์ ๋์ด๋ฅผ Rank๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅํ๋ค.
- ๋จ ํ๋์ ๋ ธ๋๋ก ๋ ํธ๋ฆฌ์ ๋์ด๋ 0์ด๋ผ๊ณ ์ ์ํ๋ค.
- ๋ฃจํธ ๋ ธ๋์ ๋ญํฌ๊ฐ ํด๋น ์งํฉ์ ๋ญํฌ๊ฐ ๋๋ค.
๊ฒฝ๋ก ์์ถ
- Find-Set์ ํํ๋ ๊ณผ์ ์ ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ์ค์ด๋ ์์ด๋์ด์ด๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก๋ Find-Set๊ณผ ๊ฐ์ด ํํ๋ Find-Set(x)๋ฅผ ์ํํ๋ ๊ณผ์ ์์ ๋ง๋๋ ๋ชจ๋ ๋ ธ๋๊ฐ ์ง์ ๋ฃจํธ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ๋ค.
๋๊ธ