Union-Find(Disjoint Set Union, 서로소 집합)는 원소들을 서로소 집합으로 분할하여 추적하며 거의 O(1)인 두 연산을 지원합니다. find(x는 어느 집합에 있는가?)와 union(두 집합을 병합)입니다. 연결성 질의에 탁월합니다.
개념
각 집합은 대표 루트를 가진 트리입니다. **path compression(경로 압축)**과 **union by rank/size(랭크/크기 기준 합치기)**를 사용하면 연산이 거의 상수의 분할 상환 시간(역 Ackermann, α(n))에 실행됩니다.
예시
python
:
():
.parent = ((n))
.rank = [] * n
():
.parent[x] != x:
.parent[x] = .parent[.parent[x]]
x = .parent[x]
x
():
ra, rb = .find(a), .find(b)
ra == rb:
.rank[ra] < .rank[rb]:
ra, rb = rb, ra
.parent[rb] = ra
.rank[ra] == .rank[rb]:
.rank[ra] +=
