- 연결리스트로 된 두 집합을 합칠 때, 작은 집합을 큰 집합의 뒤에 붙인다. (포인터 갱신 작업을 최소화)
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]);
}
연산의 효율을 높이는 방법
1. 랭크를 이용한 Union
: 두 집합을 합칠 때 랭크가 낮은 집합을 랭크가 높은 집합에 붙인다.
트리의 깊이를 낮게 유지하기 위한 방법.
Find-Set(g)의 연산과정에서 g의 원소 그리고 g의 원소와 연결되어 있는 원소가 대표원소를 가리키게 한다.
Make-Set(x) { // 노드 x를 유일한 원소로 하는 집합을 만든다.
p[x] <- x;
rank[x] <- 0;
Union(x,y) { // 노드 x가 속한 집합과 노드 y가 속한 집합을 합한다.
x' <- Find-Set(x);
y' <- Find-Set(y);
if ( rank[x'] > rank[y'])
then p[y'] <- x';
else {
p[x'] <- y;
if (rank[x'] = rank[y'])
then rank[y'] <- rank[y'] + 1;
}
}
Find-Set(x) { // 노드 x가 포함된 트리의 루트를 리턴한다.
if (p[x] != x ) then p[x] <- Find-Set(p[x]);
return p[x];
}