๐ง ์ ๋์จ ํ์ธ๋ ์๋ฃ๊ตฌ์กฐ
์ ๋์จ ํ์ธ๋ ์๋ฃ๊ตฌ์กฐ(๋๋ ์๋ก์ ์งํฉ(disjoint set) ์๋ฃ๊ตฌ์กฐ)๋ ๋ค์ ๋ ์ข ๋ฅ์ ์ฐ์ฐ์ ์ง์ํ๋ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค.
Union : ๋ ๊ฐ์ ๋ ธ๋๊ฐ ํฌํจ๋ ์งํฉ์ ํ๋์ ์งํฉ์ผ๋ก ํฉ์น๋ ์ฐ์ฐ
Find : ํน์ ๋ ธ๋๊ฐ ์ํ ์งํฉ์ ๋ฃจํธ ๋ ธ๋๋ฅผ ๋ฐํํ๋ ์ฐ์ฐ
์ฐ์ ๋๋น๋๋์ ์ค๋ช ์ด ๊ต์ฅํ ์ข๊ธฐ ๋๋ฌธ์, ๋๋น๋๋์ ์ ํ๋ธ ๋งํฌ๋ฅผ ๊ฑธ์ด๋๋๋ก ํ๊ฒ ์ต๋๋ค.
( ์ ๋ ๊ทธ๋ฅ ์ ๊ฐ ๊ณต๋ถํ๋ ค๊ณ ๊ธ ์ด ๊ฑฐ๋๊น, ์ ํ๋ธ ๋ณด๋ฌ ๊ฐ์ธ์ฌ..ใ ใ )
โญ๏ธ Find ์ฐ์ฐ
Find ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ํตํด ๊ตฌํํ ์ ์์ต๋๋ค.
1. ํด๋น ๋ ธ๋์ ๋ถ๋ชจ ๋ ธ๋์ ํด๋น ๋ ธ๋๋ฅผ ๋น๊ตํฉ๋๋ค. ์ด๋ ๋ ๋ ธ๋๊ฐ ๊ฐ์ ๊ฒฝ์ฐ, ํด๋น ๋ ธ๋๋ ๋ฃจํธ ๋ ธ๋์ ๋๋ค.
2. ๋ง์ฝ ๊ฐ์ง ์๋ค๋ฉด ํด๋น ๋ ธ๋์ ๋ถ๋ชจ ๋ ธ๋์ ๋ํ์ฌ find ์ฐ์ฐ์ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํฉ๋๋ค.
์๋์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
find(x) {
if (x == x.parent) { // ๋ฃจํธ ๋
ธ๋์ธ ๊ฒฝ์ฐ
return x
}
return find(x.parent); // ๋ถ๋ชจ์ ๋ํด ์ฌ๊ท์ ์ผ๋ก find ํธ์ถ
}
โญ๏ธ Union ์ฐ์ฐ
Union ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
1. ๋ ๋ ธ๋์ ๋ํด Find ์ฐ์ฐ์ ๊ฐ๊ฐ ์ํํ์ฌ, ๋ ๋ ธ๋๊ฐ ๊ฐ๊ฐ ์ํ ์งํฉ์ ๋ฃจํธ ๋ ธ๋๋ฅผ ์ฐพ์๋ ๋๋ค.
2. ๋ ๋ฃจํธ ๋ ธ๋์ Rank๋ฅผ ๋น๊ตํ ๋ค Rank๊ฐ ์์ ๋ฃจํธ ๋ ธ๋์ ๋ถ๋ชจ๋ฅผ, Rank๊ฐ ํฐ ๋ฃจํธ ๋ ธ๋๋ก ์ค์ ํฉ๋๋ค.
์ด๋, ๋ ๋ฃจํธ ๋ ธ๋์ Rank๊ฐ ๊ฐ์ ๊ฒฝ์ฐ ์ด๋ค ์์ผ๋ก ํฉ์ณ์ ธ๋ ์๊ด์์ผ๋, ํฉ์ณ์ง ์ดํ ๋ฃจํธ๋ ธ๋์ Rank๋ฅผ 1 ์ฌ๋ ค์ฃผ๋ ์์ ์ด ํ์ํฉ๋๋ค.
์๋์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
union(x, y) {
xRoot = find(x)
yRoot = find(y)
// x๊ฐ ์ํ ์งํฉ์ Root node์ Rank๊ฐ ๋ ๋์ ๊ฒฝ์ฐ
if (xRoot.rank > yRoot.rank) {
// y๊ฐ ์ํ ์งํฉ์ x๊ฐ ์ํ ์งํฉ์ ํ์ ์งํฉ์ผ๋ก ํฌํจ์ํค๊ธฐ
yRoot.parent = xRoot
}
// y๊ฐ ์ํ ์งํฉ์ Root node์ Rank๊ฐ ๋ ๋์ ๊ฒฝ์ฐ || Rank๊ฐ ๋์ผํ ๊ฒฝ์ฐ
else {
xRoot.parent = yRoot
// ๋ Rank๊ฐ ๋์ผํ ๊ฒฝ์ฐ yRoot์ Rank๋ฅผ 1 ์ฌ๋ ค์ฃผ์ด์ผ ํจ
if (xRoot.rank == yRoot.rank) {
yRoot.rank ++
}
}
}
โญ๏ธ ์ค์ ๊ตฌํ
์ ๋ ์ฝํ๋ฆฐ์ผ๋ก ๊ตฌํํ์ต๋๋ค.
class UnionFind {
/**
* Root Vertex ๋ฐํ
*/
fun find(vertex: Vertex): Vertex {
if (vertex == vertex.parent) {
return vertex
}
return find(vertex.parent)
}
fun union(
x: Vertex,
y: Vertex,
) {
val xRoot = find(x)
val yRoot = find(y)
if (xRoot.rank > yRoot.rank) {
yRoot.parent = xRoot
}
else {
xRoot.parent = yRoot
if (xRoot.rank == yRoot.rank) {
yRoot.rank += 1
}
}
}
}
class Vertex(
val value: String,
) {
var rank: Int = 1
var parent: Vertex = this
}
๐ง ์ ๋์จ ํ์ธ๋ ์๋ฃ๊ตฌ์กฐ์ ํน์ง
โญ๏ธ Property 1
๊ฐ set์ ํด๋นํ๋ tree์์ ์ด๋ ํ node๋ ํด๋น node์ parent ๋ณด๋ค rank๊ฐ ์์ต๋๋ค.
โญ๏ธ Property 2
๊ฐ set์ ํด๋นํ๋ tree์์ rank๊ฐ k์ธ root node๋ ์ต์ $2^k$ ๊ฐ์ node๋ฅผ descendeant๋ก ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ฆ๋ช ์ ๊ท๋ฉ๋ฒ์ ์ฌ์ฉํ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฐ์ k = 0 ์ธ ๊ฒฝ์ฐ, rank๊ฐ 0์ธ root node๋ 1๊ฐ์ node๋ง์ ๊ฐ์ง๋ฏ๋ก ์ฑ๋ฆฝํฉ๋๋ค.
์์์ k์ ๋ํ์ฌ rank๊ฐ k์ธ root node๋ ์ต์ $2^k$ ๊ฐ์ node๋ฅผ descendeant๋ก ๊ฐ์ง๊ณ ์๋ค๊ณ ํ๊ฒ ์ต๋๋ค.
rank๊ฐ k์ธ root node 2๊ฐ๋ฅผ union ํ๋ ๊ฒฝ์ฐ, rank๋ 1 ์ฆ๊ฐํ๋ฉฐ, ํ ์ชฝ์ root node์ parent๊ฐ ๋ค๋ฅธ ์ชฝ์ root node๋ก ์ค์ ๋ฉ๋๋ค.
union ๊ฒฐ๊ณผ๋ก ํฉ์ณ์ง set์ ํด๋นํ๋ tree์ root node์ rank๋ k + 1์ ๋๋ค.
์ด๋ ํฉ์ณ์ง set์ ํด๋นํ๋ tree์ ๋ ธ๋์ ๊ฐ์๋ฅผ $n_u$ ๋ผ ํ๊ณ ,
ํฉ์ณ์ง๊ธฐ ์ rank k์ธ ๋ root node๊ฐ ํฌํจ๋ tree์ ๋ ธ๋์ ๊ฐ์๋ฅผ ๊ฐ๊ฐ $n_1, n_2$ ๋ผ ํ๊ฒ ์ต๋๋ค.
๊ฐ์ ์ ์ํด $n_1 \geq 2^k$ ์ด๋ฉฐ $n_2 \geq 2^k$ ์ด๋ฏ๋ก
$n_u = n_1 + n_2 \geq 2^k + 2^k = 2^{k+1}$ ์ ๋๋ค.
๋ฐ๋ผ์ ๋ชจ๋ k์ ๋ํด ์ ์์ฑ์ด ์ฑ๋ฆฝํฉ๋๋ค.
โญ๏ธ Property 3
๊ฐ set์ ํด๋นํ๋ tree์์ rank๊ฐ k์ธ node๋ ์ต๋ $\frac{n}{2^k}$ ๊ฐ ์ ๋๋ค.
๐ง ๊ฒฝ๋ก ์์ถ (Path compression)
์์์ ์ดํด๋ณธ Find ์๊ณ ๋ฆฌ์ฆ์, Union ์ฐ์ฐ์ด ํธํฅ๋๊ฒ ์ด๋ฃจ์ด์ง๋ ๊ฒฝ์ฐ ๋นํจ์จ์ ์ผ๋ก ๋์ํฉ๋๋ค.
์ต์ ์ ๊ฒฝ์ฐ Find ํจ์๋ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ค ํ์ธํ๊ฒ ๋์ด ์๊ฐ ๋ณต์ก๋๊ฐ $O(n)$ (n์ Vertex์ ๊ฐ์)์ด ๋์ด๋ฒ๋ฆฝ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด, Find ํจ์๋ฅผ ์ต์ ํํ๊ธฐ ์ํ ๊ฒฝ๋ก ์์ถ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ฒฝ๋ก ์์ถ์ ๋ค์๊ณผ ๊ฐ์ด ์ด๋ฃจ์ด์ง๋๋ค.
Find ํจ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ ๋ค, parent ๊ฐ์ Find ํจ์์ ๊ฒฐ๊ณผ๋ก ๊ฐฑ์ ํฉ๋๋ค
์ ๋ฐฉ๋ฒ์ ํตํด find๋ฅผ ํ๋ฉฐ ์ง๋์น๋ ๋ชจ๋ node๋ค์ ๋ํ์ฌ, ํด๋น Set์ ๋ฃจํธ๋ ธ๋์ ์์(Child) ๋ ธ๋๋ก ๋ง๋ค์ด ์ค ์ ์์ต๋๋ค.
์๋์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
find(x) {
if (x != x.parent) { // ๋ฃจํธ ๋
ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ
x.parent = find(x.parent) // ๋ฃจํธ ๋
ธ๋์ ์์ ๋
ธ๋๋ก ํธ๋ฆฌ ๊ตฌ์กฐ ๋ณ๊ฒฝ
}
return x.parent
}
์ค์ ๊ตฌํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
fun find(vertex: Vertex): Vertex {
if (vertex != vertex.parent) {
vertex.parent = find(vertex.parent)
}
return vertex.parent
}
์ต์ ์ ์ฅ ํธ๋ฆฌ(MST)๋ฅผ ๊ตฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์ ๋์จ ํ์ธ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ ์ ์์ผ๋ฉฐ,
๊ณง ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค :)
โญ๏ธ ์ฐ์ต๋ฌธ์
์๋ ๋ฌธ์ ๋ ๋ฐฑ์ค์ ์๋ ์ ๋์จ ํ์ธ๋ ๊ธฐ๋ณธ ๋ฌธ์ ์ ๋๋ค.
ํ๋ฒ ํด๋ณด์ธ์ฉ :))
https://www.acmicpc.net/problem/1717