**disjoint-set(서로소 집합, union-find)**은 겹치지 않는 그룹으로 분할된 원소들을 추적하며, "이 둘이 같은 그룹에 있는가?"와 "두 그룹을 병합하라"를 거의 상수 시간에 답합니다. **경로 압축(path compression)**과 **랭크 기반 합집합(union by rank)**을 사용하면 두 연산 모두 **O(α(n))**으로 동작합니다. 사실상 O(1)입니다(α는 역 아커만 함수).
동작 방식
각 집합은 트리이고, 루트가 집합의 대표입니다. find는 루트까지 걸어가고, union은 한 루트를 다른 루트 아래에 연결합니다.
text
find(x): 부모를 따라 루트까지 감
union(a,b): 더 짧은 트리를 더 큰 트리 아래에 붙임(랭크 기준)
경로 압축: find 후, 노드들이 루트를 직접 가리키게 함
이전: a->b->c->root 이후: a->root, b->root, c->root
