record logo record

합집합 찾기(Union-Find) 이란?


합집합 찾기(Union-Find)의 특징


트리를 이용한 방법으로 구현하는 이유

배열을 이용하여 Union-Find를 구현 할 수 있지만, Union 연산 수행 시 배열의 모든 원소를 순회해야 하기 때문에 시간복잡도가 O(N) 이 된다.

  • 트리를 이용하여 Union-Find를 구현하면 배열보다 빠르게 Union 연산을 수행할 수 있다.

합집합 찾기(Union-Find)의 알고리즘 예시

C++ STL Library를 사용한 합집합 찾기(Union-Find) 구현

#include <stdio.h>

// 부모 노드를 찾는 함수 
int getParent(int parent[], int x) {
	if(parent[x] == x) return x;
	return parent[x] = getParent(parent, parent[x]);
} 
// 두 부모 노드를 합치는 함수 
int unionParent(int parent[],int a, int b){
	a = getParent(parent, a);
	b = getParent(parent, b);
	if(a < b) parent[b] = a;
	else parent[a] = b;
	
}

// 같은 부모를 가지는지 확인 == 같은 그래프인지 확인 
int findParent(int parent[], int a, int b){
	a = getParent(parent, a);
	b = getParent(parent, b);
	if(a == b) return 1;
	return 0;
}

int main(void){
	int parent[11];
	for(int i = 0; i <= 10; i++){
		parent[i] = i;
	}
	unionParent(parent, 1, 2);
	unionParent(parent, 2, 3);
	unionParent(parent, 3, 4);
	unionParent(parent, 5, 6);
	unionParent(parent, 6, 7);
	unionParent(parent, 7, 8);
	
	printf("1과 5가 연결되어있나? %d \n", findParent(parent, 1, 5));
	unionParent(parent, 1, 5);
	printf("1과 5가 연결되어있나? %d \n", findParent(parent, 1, 5));
	
	return 0;
}

Union-Find 최악의 경우 & 최적화한 방법

최악의 상황

find 연산 최적화

References