[예시] 다음의 상호배타적 집합이 연결리스트로 완성되기까지의 연산 과정을 쓰시오. (Make-set, union, find-set 등 사용)
{a, e, f} , {h, i, g, b}
[정리] 연결리스트를 이용해 표현되는 배타적 집합들을 만들면서 Weight을 고려한 Union을 사용할 때, m번의 Make-Set, Union, Find-Set 중 n번이 Make-Set이라면 이들의 총 수행시간은 O(m + nlog n)이다.
[증명]
Make-Set을 수행한 횟수만큼 한 개씩의 원소를 가지는 n개의 집합이 생겼을 것이다. Weight를 고려한 Union을 자유롭게 적용함으로써 임의의 원소 x에 대한 대표 포인터 갱신 횟수 m을 최대가 되게 할 때의 m은 어떤 값인가?
1) Make-Set 8번
[설명] 임의의 원소 x를 위 예시에서 h로 잡을 경우 최대 3회가 된다.
2) Make-Set 16번
m = log2(16) = 4
3) Make-Set 32번
m = log2(16) = 5
4) Make-Set 64번
m = log2(16) = 6
5) Make-Set 2^k번
m = log2(2^k) = k
복잡도 분석
Make-Set : 상수 이내
Find-Set : 상수 이내
union : logn
n개의 원소에 union 적용 시 : nlogn
트리를 이용한 집합 처리
• 같은 집합의 원소들은 하나의 트리로 관리한다
– 자식 노드가 부모 노드를 가리킨다
• 트리의 루트를 집합의 대표 원소로 삼는다
Make-Set(x) { # 노드 x를 유일한 원소로 하는 집합을 만든다.
p[x] ← x;
}
Union(x, y) { # 노드 x가 속한 집합과 노드 y가 속한 집합을 합친다
p[Find-Set(y)] ← Find-Set(x);
}
Find-Set(x) { # 노드 x가 속한 집합을 알아낸다. 노드 x가 속한 트리의 루트 노드를 리턴한다.
if (x = p[x])
then return x;
else return Find-Set(p[x]);
}