유니온파인드 이해하기 (예제코드 포함)
2024. 11. 17. 23:30ㆍAlgorithm/그래프
반응형
유니온 파인드(Union-Find)
유니온 파인드는 서로소 집합(Disjoint Set)을 표현하고 관리하기 위해 사용하는 자료구조입니다.
서로소 집합은 겹치는 원소가 없는 여러 그룹으로 나뉜 데이터를 표현하며, 대표적으로 그래프에서의 연결성 확인에 사용됩니다.
주요 연산
- Find(찾기):
- 특정 원소가 어떤 집합에 속해 있는지 확인합니다.
- 집합을 식별할 수 있도록 각 집합에는 고유한 root가 있습니다.
- x의 부모를 찾는 과정
- 경로 압축(Path Compression)을 사용해 탐색 과정에서 트리의 깊이를 줄여 효율성을 높입니다.
- Union(합치기):
- 두 집합을 하나로 합치는 과정. 집합의 대표자를 기준으로 병합.
- 일반적으로 한 집합의 루트를 다른 집합의 루트로 설정하여 합칩니다.
유니온 파인드 알고리즘의 특징
- 시간 복잡도:
- 효율성을 위해 경로 압축(Path Compression)과 랭크 기반 합치기(Union by Rank)를 함께 사용할 경우,
- 거의 O(1)에 가까운 시간 복잡도를 가집니다.
- 이를 통해 최악의 경우에도 상수에 가까운 속도로 Find와 Union 연산을 수행합니다.
- 적용 사례:
- 최소 신장 트리(Minimum Spanning Tree): Kruskal's Algorithm.
- 그래프에서 연결 요소 찾기.
코드 설명 및 예제
1. 초기화
for(int i = 1; i <= n; i++) {
parent[i] = i;
}
각 원소는 처음에 자기 자신을 부모로 설정합니다. 즉, 모든 원소가 독립적인 집합으로 초기화됩니다.
2. 찾기(Find)
private static int find(int x) {
if (x == parent[x]) return x;
return parent[x] = find(parent[x]); // 경로 압축
}
- 재귀적으로 부모를 따라가며 최상위 루트를 찾습니다.
- 경로 압축을 통해 탐색한 모든 원소가 루트를 직접 가리키게 합니다.
3. 합집합(Union)
private static void union(int a, int b) {
a = find(a);
b = find(b);
if (a != b) parent[b] = a; // 한 집합으로 병합
}
- find를 통해 두 원소의 루트를 찾습니다.
- 두 루트가 다르면 하나의 집합으로 합칩니다.
4. 동일 집합 확인(Check Same)
private static boolean checkSame(int a, int b) {
return find(a) == find(b);
}
두 원소의 루트를 비교하여 같은 집합에 속하는지 확인합니다.
예제 코드
반응형
'Algorithm > 그래프' 카테고리의 다른 글
최소신장트리(MST) (0) | 2024.09.21 |
---|---|
벨만포드 알고리즘(JAVA) (2) | 2024.08.10 |
플로이드-워셜(floyd-warshall) (0) | 2024.08.08 |
그래프 알고리즘 (0) | 2024.08.08 |
다익스트라(dijkstra) (0) | 2024.08.08 |