Disjoint Set
서로소 집합 (Disjoint Set)
- 서로소 집합 == 상호배타 집합
서로소 집합 연산
연산 | 설명 |
---|---|
Make-Set(x) | x가 대표자인 집합 생성 |
Find-Set(x) | x가 포함된 집합의 대표자를 반환 |
Union(x, y) | x, y가 포함된 집합을 하나의 집합으로 만듦 |
- 아래와 같은 테이블을 이용하여 연산
노드 | ||||
---|---|---|---|---|
p (노드의 부모) | ||||
rank (노드의 트리 랭크 값) |
- Make-Set(x)
def Make-Set(x) :
p[x] = x
rank[x] = 0
- Find-Set(x)
def Find-Set(x) :
if x != p[x] : # x가 루트가 아닌 경우
p[x] = Find-Set(p[x]) # x의 부모에 대해서 Find-Set (파라미터가 루트일 때까지)
return p[x] # x가 루트이면 return
- Union(x, y)
def Union(x, y) :
p[Find-Set(y)] = Find-Set(x) # y의 대표자를 x의 대표자로 바꿈
cf) Rank 사용하는 경우
def Union(x, y):
Link(Find_Set(x), Find_Set(y))
def Link(x, y):
# rank가 더 작은 것을 더 높은 곳에 붙임
if rank[x] > rank[y]:
p[y] = x
else:
p[x] = y
# rank가 같은 경우에는 둘 중 하나를 루트로 설정하고, 루트로 설정한 노드의 rank를 ++
if rank[x] == rank[y]:
rank[y] += 1
참고 자료
Leave a comment