문제 9 · 연결 리스트로 구현한 서로소 집합
문제 9 [4점]
2개의 서로소 집합disjoint set union 연산을 시행한 후의 모습도 그리시오(1점). 또한, 연결 리스트를 이용하여 서로소 집합을 구현할 때의 특징을 서술(2점)하시오.
풀이 및 해설
연결 리스트 표현
각 집합을 하나의 연결 리스트로 만든다. 리스트의 첫 원소를 대표원(head) 으로 삼고, 각 원소는 다음 원소를 가리키는 포인터와 함께 대표원을 가리키는 포인터(어느 집합에 속하는지 빠르게 알기 위함)를 갖는다.
text
집합 1: head → a0 → a1 → a2 → NULL (대표원: a0)
집합 2: head → a3 → a4 → a5 → a6 → NULL (대표원: a3)
(a0,a1,a2 는 모두 대표원 a0 을 가리킴)
(a3,a4,a5,a6 는 모두 대표원 a3 을 가리킴)union 후의 모습
union(집합1, 집합2) 는 한 리스트의 꼬리에 다른 리스트를 이어 붙인다. 짧은 집합(원소 3개)을 긴 집합(원소 4개) 뒤에 붙이는 것이 유리하다(합병 정렬식 가중 합집합).
text
합쳐진 집합: head → a3 → a4 → a5 → a6 → a0 → a1 → a2 → NULL
(대표원: a3)
옮겨 붙은 a0,a1,a2 의 대표원 포인터를 a3 으로 갱신해야 함연결 리스트 구현의 특징
find(대표원 찾기): 각 원소가 대표원 포인터를 가지므로 .union: 리스트를 잇는 것은 꼬리 포인터가 있으면 이지만, 옮겨 붙는 쪽 원소들의 대표원 포인터를 모두 갱신해야 하므로 그 집합 크기에 비례하는 비용이 든다.- 가중 합집합(union by size): 항상 작은 집합을 큰 집합에 붙이면, 한 원소의 대표원 포인터가 갱신되는 횟수가 최대
번으로 제한되어, 번 union 전체 비용이 이 된다. - 트리 기반 구현(union by rank + 경로 압축)이 점근적으로 더 빠르지만, 연결 리스트 방식은
find가 항상 상수 시간이라는 장점이 있다.