Learn and Be Curious

dev/algorism +1

● 정의

유니온-파인드(Union-Find) 자료구조 (혹은 Disjoint-Set 자료구조)는 교집합이 존재하지 않는 상호 배타적인 부분집합들로 나누어진 원소들에 대한 정보를 가진 자료구조

● 설명

자료구조에서 제공하는 연산은 두 가지
1. Group (Find) : 어떤 원소가 어느 집합에 속해 있는지를 알려주는 연산
2. Join (Union) : 두 개의 부분집합을 하나의 집합으로 합치는 연산. 즉, 두 개의 원소를 입력으로 주면 그 두 원소가 서로 다른 집합에 속할 경우 그 집합을 하나로 합침

● 예시

시간 복잡도를 대폭 개선하여 가장 널리 사용하고 있는 경로 압축 (Path Compression) 을 이용한 구현법을 소개
초기의 Set 배열 변수는 모두 0 으로 초기화되어 있다고 가정

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// UnionFind.cpp
const int _M_size_ = 1000; // max number of elements 
   
int Set[_M_size_ + 1]; // starts with 1. index 0 is not used. 
   
int group(int n) { 
    if (!Set[n]) return n; 
    return Set[n] = group(Set[n]); // path compression 
   
void join(int a, int b) { 
    int A(group(a)), B(group(b)); 
    if (A != B) Set[A] = B;
}


Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// UnionFind.java 
class UnionFind { 
    // max number of elements 
    static final int _M_size_ = 1000
       
    // starts with 1, index 0 is not used. 
    static int Set[] = new int[_M_size_ + 1]; 
       
    static int group(int n) { 
        if(Set[n] == 0) return n; 
        return Set[n] = group(Set[n]); // path compression 
    
       
    static void join(int a, int b) { 
        int A = group(a), B = group(b); 
        if (A != B) Set[A] = B; 
    }