728x90
반응형
[알고리즘] 서로소 집합(Disjoint-sets)
서로소 or 상호배타 집합
서로 중복 포함된 원소가 없는 집합
(= 즉, 교집합이 없는 것)
대표자(representative)
집합에 속한 하나의 특정 멤버를 통해서 각 집합들을 구분
상호배타 집합 표현 방법
연결 리스트
트리
상호배타 집합 연산
Make-Set(x), Find-Set(x), Union(x,y)
트리를 이용해 상호배타 집합 표현된 모습
부모는 해당 노드의 Find-Set 값
연산
Make_Set(x) : 유일한 멤버 x를 포함하는 새로운 집합을 생성하는 연산
Find_Set(x) : x를 포함하는 집합을 찾는 연산(해당 노드의 부모 정보 갱신)
Union(x,y) : x와 y를 포함하는 두 집합을 통합하는 연산
Make_Set(x)
1 2 3 | public static void makeSet(int x){ parent[x] = x; // 부모 : 자신의 index로 표시 } | cs |
Find_Set(x)
1 2 3 4 5 6 7 8 9 | public static int findSet(int x){ if(x == parent[x]) return x; else { parent[x] = findSet(parent[x]); return parent[x]; } } | cs |
Union(x,y)
1 2 3 4 5 6 7 8 | public static void union(int x, int y) { int px = findSet(x); int py = findSet(y); if (px != py){ parent[py] = px; } } | cs |
전체 소스 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | /* * 상호배타 집합 => MST (크루스칼 알고리즘에 활용) * makeSet(int x) 멤버 x를 포함하는 새로운 집합을 생성 * findSet(int x) 멤버 x를 포함하는 집합의 대표자를 리턴 * union(int x, int y) 멤버 x,y의 대표자를 구해서 두 집합을 통합 * link(int px, int py) x의 대표자의 집합과 y의 대표자의 집합을 합침 */ public class Disjoint_sets { static int[] parent = new int[10]; // 부모 저장 배열 static int[] rank = new int[parent.length]; // 랭크 저장 배열 public static void main(String[] args) { for (int i = 0; i < parent.length; i++) { makeSet(i); } printSet(); union(0, 1); printSet(); union(3, 5); printSet(); union(0, 3); printSet(); } public static void printSet() { // 출력 System.out.print("index : "); for (int i = 0; i < parent.length; i++) { System.out.print(i + " "); } System.out.println(); System.out.print("parent : "); for (int i = 0; i < parent.length; i++) { System.out.print(parent[i] + " "); } System.out.println(); System.out.println(); } public static void makeSet(int x){ parent[x] = x; // 부모 : 자신의 index로 표시 } public static int findSet(int x){ if(x == parent[x]) return x; else { parent[x] = findSet(parent[x]); return parent[x]; } } public static void union(int x, int y) { int px = findSet(x); int py = findSet(y); if (px != py){ parent[py] = px; } } } | cs |
이와 같은 연산을 활용해 MST(최소 신장트리), Prim이나 KRUSKAL 알고리즘에서 적용시킬 수 있다.
728x90
반응형
'Algorithm > 개념 정리' 카테고리의 다른 글
[Java] HashSet을 ArrayList로 변환하기 (0) | 2019.04.30 |
---|---|
[Java] String 문자열 reverse하기 (0) | 2019.03.26 |
[알고리즘] 트라이(Trie) - Java (1) | 2019.02.19 |
[알고리즘] 다익스트라(Dijkstra) - Java (0) | 2019.02.19 |
[알고리즘] 동적 계획법(Dynamic Programming) & 메모이제이션(Memoization) (0) | 2019.02.18 |