: Disjoint set을 표현할 때 사용하는 알고리즘
Disjoint Set
: 서로 중복되지 않는 부분 집합들로 나누어진 원소들에 대한 정보를 저장하고 조작하는 자료구조
➡️ 서로소 집합 자료구조
유니온 파인드는 트리구조를 이용하여 구현한다.
Array[i]
make-set(x)
union(x, y)
find(x)
같은 집합 = 하나의 트리
➡️ 집합 번호 = 루트노드
make-set(x)
find(x)
평균적인 시간복잡도는 트리의 높이만큼 탐색하게 되므로 O(logN)
make-set(x)
union(x, y)
find(x)
int find(int x) {
if(parent[x] == x) return x;
return parent[x] = find(parent[x]);
}
void merge(int x, int y) {
x = find(x);
y = find(y);
if(x == y) return;
parent[y] = x;
/**
* x와 y의 루트 노드가 같다면 같은 집합이므로 종료하고
* 그게 아니라면 y의 부모를 x로 바꿈
*/
}
find
= Find ➡️ 루트 노드를 찾는 함수, 루트에 도달할 때까지 부모노드로 거슬러 올라감
merge
= Union ➡️ x 또는 y를 포함하는 부분 집합을 나타내는 트리를 다른 것의 부트리로 만들기