문제 9 · 트리 기반 서로소 집합의 문제점과 개선
문제 9 [4점]
아래 배열array은 트리 기반 서로소 집합disjoint set을 구현한 결과이다. 이를 트리 형태로 그리고(2점), 이 서로소 집합이 가지는 문제점과 개선 방안을 서술(2점)하시오.
풀이 및 해설
배열 읽기
배열의 각 칸은 그 노드의 부모 인덱스이고, 값
| 인덱스 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| 부모 | −1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
7은 6을, 6은 5를, …, 1은 0을 부모로 가리키므로 하나의 긴 사슬(chain) 이다.
트리 형태
text
0 (루트)
│
1
│
2
│
3
│
4
│
5
│
6
│
7문제점
union을 아무 순서로나(항상 한쪽을 다른 쪽 밑에 붙이는 식으로) 수행하면, 이렇게 한 줄로 늘어진 편향 트리가 만들어진다. 이때 트리의 높이가 find 연산이 루트까지
개선 방안
- 랭크(또는 크기)에 의한 합집합union by rank/size: union할 때 낮은(작은) 트리를 높은(큰) 트리 밑에 붙인다. 이렇게 하면 트리 높이가
이하로 유지된다. - 경로 압축path compression:
find도중 거쳐 간 모든 노드를 곧바로 루트에 직접 연결한다. 이후의find가 훨씬 짧아진다.
두 기법을 함께 쓰면