[ALGO] Lect12. 서로소 집합 자료구조의 원리 및 크루스칼 알고리즘
교수: 성균관대학교 소프트웨어학과 허재필 교수님
사이트: http://www.kmooc.kr/courses/course-v1:SKKUk+SKKU_46+2021_T1/course/
이번 시간에는
Disjoint Set, 서로소 집합
서로소 집합(Disjoint Set)
개념
Disjoint Set이란
Operations
Disjoint Set에 대해 대표적으로
make-set(x)
: 멤버가 오직 x뿐인새로운 집합을 생성 한다.(∴ 대표값=x) union-set(x,y)
: x, y로 대표되는 집합을합집합 한다.find-set(x)
: x를 멤버로 갖는 집합의대표값을 반환 한다.
■ 응용
find-set(x)==find-set(y)
인 경우, 두 멤버 x, y는같은 집합에 포함되어 있다. >- connected components
Connected Components
Implementation
■ Poor Implementation
모든 vertex에 대한
- 멤버 x의 집합을 알아내는 Finding 연산:
$Θ(1)$ > union-set(x,y)
:$Θ(n)$ (∵ y가 속한 집합의 모든 멤버를 조사하여 x가 속한 집합의 대표자로 대표자값을 바꿔줘야 한다.)
■ Implementation
2D array를 사용하는 방식은 연산에 비용이 많이 소요되기 때문에 실제로는 아래와 같이
-
union-set(x,y)
을 수행하는 경우단순히 root값을 자식 node로 추가 해준다. find-set(x)
: $O(h)$union-set(x,y)
: $O(h)$
※ 일반적인 tree 자료구조는 부모가 자식 nodes를 point하지만, disjoint set을 구현하기 위한 tree 구조에서는
● Generation of Disjoint Set
$n$개의 데이터에 대해
parent = new int[n];
for(int i=0; i<n; i++)
parent[i] = i;
● Find-set(x):
int Find_Set(int x)
{
while(parent[x] != x)
x = parent[x];
return x;
}
● Union-set(x,y): x와 y가 속한 집합의
x와 y의
void Union_Set(int x, int y)
{
x = Find_Set(x);
y = Find_Set(y);
if(x!=y)
parent[y] = x;
}
※ 이때
Example
■ union-set(1,3)
■ find-set(1) and find-set(3)
■ union-set(3,5)
■ union-set(5,7)
Worst-Case Scenario
이때 각 level에서 nodes의 개수를 세 보면
Pascal’s Triangle
\[\begin{pmatrix} n\\ m \end{pmatrix} = \begin{cases} 1 & \text{$m=0$ or $m=n$}\\ \begin{pmatrix} n-1\\ m \end{pmatrix} + \begin{pmatrix} n-1\\ m-1 \end{pmatrix} & \text{$0<m<n$} \end{cases}\\ =\frac{n!}{m!(n-m)!}\]이러한 Pascal’s Triangle을 알면
따라서
⇒ Disjoint Set이
서로소 집합과 크루스칼 알고리즘
Kruskal’s Algorithm using Disjoint Sets
Kruskal’s Algorithm은
■ Example
Analysis
■ Worst Case
아래 알고리즘에 대해 전체 edges 개수 $E$만큼 반복
- 두 vertex가
같은 집합에 포함되었는지를 확인 (find-set) : $O(\lg(V))$ - 서로 다른 집합에 속하는 경우
- 두 집합을
합집합 화 (union-set): $O(\lg(V))$
- 두 집합을
따라서 Complexity는 다음과 같다.
\[E·(\lg(V) + \lg(V)) = 2E\lg(V)\\ \text{Complexity} = O(E\lg(V))\]한편, Kruskal’s Algorithm을 적용하기에 앞서
따라서 최종 complexity는 다음과 같다.
\[\text{overall complexity} = O(E\lg(V) + E\lg(V)) = O(E\lg(V))\]※ DFS(or BFS)를 이용한 Kruskal’s algorithm의 complexity $O(EV)$에 비해
References
- [집콕]인공지능을 위한 알고리즘과 자료구조: 이론, 코딩, 그리고 컴퓨팅 사고-비선형 자료구조, K-MOOC: http://www.kmooc.kr/courses/course-v1:SKKUk+SKKU_46+2021_T1/courseware/1158909c057347478d7386a2b7e97214/e9d736660cad4f76bcb9a05974fe0bf2/1?activate_block_id=block-v1%3ASKKUk%2BSKKU_46%2B2021_T1%2Btype%40vertical%2Bblock%4052b62ff6da2147c9a8a65a6056681d91