유니온 파인드 (Union-Find)

이 글의 목차12개
  1. 🚀 유니온 파인드 (Union-Find)
  2. 📌 유니온 파인드 개념
  3. 🚀 경로 압축(Path Compression)
  4. 위와같은 그림에서 루트 노드는 1이므로 모든 노드의 parent 노드를 1로 설정하는 것이 경로 압축이다.
  5. 🛠 유니온 파인드 연산 과정
  6. 1. 유니온(Union)
  7. 2. 파인드(Find)
  8. 3. 경로 압축(Path Compression)
  9. ⏰ 시간 복잡도
  10. 💻 예제 코드
  11. find 함수
  12. union 함수

🚀 유니온 파인드 (Union-Find)

**유니온 파인드(Union-Find)**는 서로소(Disjoint) 집합을 관리하는 자료구조이다.

서로 다른 그룹인지 확인“하거나 “두 그룹을 합치는” 연산을 빠르게 수행할 수 있다.

📌 유니온 파인드 개념

✔ 각 원소는 자신이 속한 집합의 루트(parent) 노드를 가진다.

✔ 유니온(Union): 두 집합을 하나로 합친다.

✔ 파인드(Find): 특정 원소가 속한 집합(대표 노드)을 찾는다.

✔ 경로 압축(Path Compression) 기법을 활용하여 성능을 향상할 수 있다.

🚀 경로 압축(Path Compression)

특정 노드의 루트(parent)를 찾을 때, 중간 경로를 한 번에 갱신하여 성능을 최적화한다.

즉, 특정 노드의 parent 노드를 루트 노드로 설정하여 연산을 최소화하는 것이다.

위와같은 그림에서 루트 노드는 1이므로 모든 노드의 parent 노드를 1로 설정하는 것이 경로 압축이다.

🛠 유니온 파인드 연산 과정

1. 유니온(Union)

✔ 두 노드가 속한 집합을 합치는 연산 ✔ 두 노드의 루트 노드를 찾고, 한 쪽을 다른 쪽에 연결한다.

2. 파인드(Find)

✔ 특정 노드의 루트 노드를 찾는 연산 ✔ parent[x]를 계속 타고 올라가면서 대표 노드를 찾는다. ✔ 경로 압축을 사용하면 루트 노드 찾는 과정이 최적화된다.

3. 경로 압축(Path Compression)

✔ find() 연산 시, 중간에 거치는 모든 노드들의 부모를 루트 노드로 직접 연결 ✔ 이를 통해 이후 탐색 속도가 획기적으로 향상됨 ✔ 시간 복잡도가 거의 O(1)에 가까운 성능을 보인다.

⏰ 시간 복잡도

기본적으로 Find() 연산은 O(log N) 이지만,

경로 압축을 적용하면 O(N) 수준으로 줄어든다.

💻 예제 코드

find 함수

parent 배열은 해당 노드에 대한 부모 노드로, find함수에서는 부모 노드를 타고 올라가 루트 노드를 리턴한다.

private static int find(int x){
        if(x == parent[x]) return x;
        else return find(parent[x]);
    }

union 함수

각 노드의 루트 노드를 확인하여 같으면 true를 리턴한다.

루트 노드가 같다 = 두 노드가 같은 트리 안에 있다.

private static boolean union(int a, int b){
        int rootA = parent[a];
        int rootB = parent[b];
        if(rootA == rootB) return true;
        else{
            parent[rootB] = rootA;
            return false;
        }
    }
전체 글 보기