Skip to content

문제 9 · 연결 리스트로 구현한 서로소 집합

문제 9 [4점]

2개의 서로소 집합disjoint set {a0,a1,a2}, {a3,a4,a5,a6}이 주어졌다. 연결 리스트를 이용하여 이를 표현(1점)하고, 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(대표원 찾기): 각 원소가 대표원 포인터를 가지므로 O(1).
  • union: 리스트를 잇는 것은 꼬리 포인터가 있으면 O(1) 이지만, 옮겨 붙는 쪽 원소들의 대표원 포인터를 모두 갱신해야 하므로 그 집합 크기에 비례하는 비용이 든다.
  • 가중 합집합(union by size): 항상 작은 집합을 큰 집합에 붙이면, 한 원소의 대표원 포인터가 갱신되는 횟수가 최대 logN 번으로 제한되어, N1 번 union 전체 비용이 O(NlogN) 이 된다.
  • 트리 기반 구현(union by rank + 경로 압축)이 점근적으로 더 빠르지만, 연결 리스트 방식은 find가 항상 상수 시간이라는 장점이 있다.
연결 리스트 서로소 집합: find=O(1), 가중 합집합 시 총 O(NlogN)
PDF