μ§ν©μ μ²λ¦¬
μνΈ λ°°νμ μΈ μ¬λ¬ κ°μ μ§ν©μ μ²λ¦¬ν΄μΌ ν κ²½μ°κ° μλλ° μ΅μ μ μ₯ νΈλ¦¬
λ₯Ό μν ν¬λ£¨μ€μΉΌ μκ³ λ¦¬μ¦
μμ μνΈ λ°°νμ μΈ μ§ν©μ μ²λ¦¬νλ μκ³ λ¦¬μ¦μ΄ νμνλ€.
μ§ν©μ κ΄λ¦¬μμ νμν μ°μ°μ μμμ μμκ° μ΄λ μ§ν©μ μνλμ§ μλλ΄λ μ°μ°κ³Ό λ μ§ν©μ ν©νλ μ°μ°μ΄λ€.
μ¬κΈ°μ λ§ νλ μνΈ λ°°νμ μΈ μ§ν©μ μλ‘μ κ΅μ§ν©μ΄ 곡μ§ν©μΈ κ²½μ°λ₯Ό λ»νλ€.
μ°κ²° 리μ€νΈλ₯Ό μ΄μ©ν μ§ν©μ μ²λ¦¬
μ°κ²° 리μ€νΈλ₯Ό μ΄μ©ν ννμ μ½κ³ μ§κ΄μ μ΄λ€. ++κ° μμλΉ νλμ λ Έλλ₯Ό λ§λ€κ³ μ΄λ€μ μ°κ²°λ¦¬μ€νΈλ‘ μ°κ²°νλ€++
λ Έλλ λ κ°μ ν¬μΈν°μ μμλ₯Ό κ°λ ν κ°μ νλλ‘ μ΄λ£¨μ΄ μ§λ€.
λ€μ μμ ν¬μΈν° -> λ€μ μμλ₯Ό κ°λ¦¬ν€λ ν¬μΈν°. κ° μ§ν©μλ λ§μ§λ§ μμλ₯Ό κ°λ¦¬ν€λ
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)λ₯Ό μννλ κ³Όμ μμ λ§λλ λͺ¨λ λ Έλκ° μ§μ λ£¨νΈ λ Έλλ₯Ό κ°λ¦¬ν€λλ‘ νλ€.
λκΈ