본문 바로가기
알고리즘 && 자료구조

Disjoint Set(서로수 집합)

by bloodFinger 2020. 7. 29.

Disjoint Set : 디스조인트 셋 ? 

 

서로수집합은 한개의 집합으로는 성립되지 않고 집합이 여러개있을때 서로서로 공통적인 원소가 없어 모든 집합의 교집합은 공집합( Φ )이 된다는 말이다.

 

 

서로수 집합도 집합이니 집합 연산이 필요한데 서로수집합은 서로 공통원소가 없으니 차집합, 교집합은 의미가 없다.

차집합 교집합을 해봤자 다 공집합이기 때문이다.

따라서 합집합만 있으면 될것 같은데 서로수집합에서 합집합을 찾는 것을 disjoint set - 유니온(Union) 이라 하고

 원소에가 트리의 어떤 루트노드에 연결되어 있는지 그 루트를 찾는 연산을 disjoint set - 파인드(Find) 라 부른다.

 

 

초기에 각 노드는 자기 자신을 루트 노드로 가진다.

for(int i = 1; i <= n; i++){
	parent[i] = i;
}

 

find()를 통해 반환되는 값은 주로 그 집합을 대표하는 값이 된다. 즉 루트노드가 된다.

public static int find(int u) { 
	if( u == parent[u] ) {
    	return u;
    }
    return parent[u] = find(parent[u]);
}

 

public static void merge(int u, int v) {
	u = find(v);
    v = find(v);
    
    if(u == v) {
    	return ;
    }
    
    parent[u] = v;
	
}

'알고리즘 && 자료구조' 카테고리의 다른 글

[java] 직접 구현해보는 큐  (0) 2021.03.21
브루트 -포스법  (0) 2020.07.28
[스터디] 검색 알고리즘  (0) 2020.07.14
백준 2606 - BFS(Breadth-First-Search)  (0) 2020.06.08
퀵 정렬( Quick Sort ) 알고리즘  (0) 2020.06.04