유니온-파인드(분리 집합) 계산기
union·find 명령을 넣으면 부모 배열이 어떻게 바뀌는지 한 단계씩 보입니다. 경로 압축과 랭크 합치기를 켜고 끄며 트리 높이가 몇으로 갈리는지 같은 명령으로 견주어 볼 수 있습니다.
0부터 7까지 번호를 씁니다. 처음에는 저마다 혼자인 8개의 집합입니다.
한 줄에 하나. 「union 0 1」 「u 0 1」 「0 1」은 합치기, 「find 0」 「f 0」은 뿌리 찾기입니다. 40줄까지.
트리의 최대 깊이
1
집합 1개로 나뉘었고, 명령을 처리하며 부모를 따라 올라간 걸음이 모두 6번입니다. 깊이가 곧 find 한 번의 최악 비용입니다.
최적화를 켜고 끄면
| 조합 | 최대 깊이 | 걸음 합 |
|---|---|---|
| 둘 다 끔 | 7 | 14 |
| 랭크만 | 1 | 6 |
| 경로 압축만 | 1 | 8 |
| 둘 다 켬 | 1 | 6 |
같은 명령 수열을 네 가지 조합으로 각각 돌린 결과입니다. 최적화를 모두 끄고 0-1, 1-2, 2-3 …처럼 사슬로 이으면 부모가 한 줄로 늘어져 깊이가 원소 수 −1이 되고, find 한 번이 O(n)이 됩니다. 랭크 합치기는 낮은 트리를 높은 트리 밑에 붙여 깊이를 log₂n 아래로 눌러 두고, 경로 압축은 한 번 훑은 길을 다음부터 한 걸음으로 만듭니다.
마지막 상태
| 원소 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 부모 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 랭크 | 1 | · | · | · | · | · | · | · |
| 깊이 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
부모가 자기 자신인 원소가 뿌리입니다. 랭크는 뿌리에만 뜻이 있어 나머지는 점으로 두었습니다. 경로 압축을 켜면 트리가 납작해지지만 랭크는 줄지 않으므로, 랭크는 실제 높이가 아니라 높이의 상한으로 보아야 합니다.
나뉜 집합
단계별로 보기
1. union(0, 1)
랭크가 0로 같아 1을 0 밑에 붙이고 0의 랭크를 1로 올렸습니다. 랭크가 오르는 것은 이때뿐입니다.
| 원소 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 부모 | 0 | 0 | 2 | 3 | 4 | 5 | 6 | 7 |
| 랭크 | 1 | · | 0 | 0 | 0 | 0 | 0 | 0 |
| 깊이 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
2. union(1, 2)
랭크가 낮은 2(0)을 높은 0(1) 밑에 붙였습니다. 높이가 자라지 않습니다.
| 원소 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 부모 | 0 | 0 | 0 | 3 | 4 | 5 | 6 | 7 |
| 랭크 | 1 | · | · | 0 | 0 | 0 | 0 | 0 |
| 깊이 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
3. union(2, 3)
랭크가 낮은 3(0)을 높은 0(1) 밑에 붙였습니다. 높이가 자라지 않습니다.
| 원소 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 부모 | 0 | 0 | 0 | 0 | 4 | 5 | 6 | 7 |
| 랭크 | 1 | · | · | · | 0 | 0 | 0 | 0 |
| 깊이 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
4. union(3, 4)
랭크가 낮은 4(0)을 높은 0(1) 밑에 붙였습니다. 높이가 자라지 않습니다.
| 원소 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 부모 | 0 | 0 | 0 | 0 | 0 | 5 | 6 | 7 |
| 랭크 | 1 | · | · | · | · | 0 | 0 | 0 |
| 깊이 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
5. union(4, 5)
랭크가 낮은 5(0)을 높은 0(1) 밑에 붙였습니다. 높이가 자라지 않습니다.
| 원소 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 부모 | 0 | 0 | 0 | 0 | 0 | 0 | 6 | 7 |
| 랭크 | 1 | · | · | · | · | · | 0 | 0 |
| 깊이 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 |
6. union(5, 6)
랭크가 낮은 6(0)을 높은 0(1) 밑에 붙였습니다. 높이가 자라지 않습니다.
| 원소 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 부모 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 7 |
| 랭크 | 1 | · | · | · | · | · | · | 0 |
| 깊이 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
7. union(6, 7)
랭크가 낮은 7(0)을 높은 0(1) 밑에 붙였습니다. 높이가 자라지 않습니다.
| 원소 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 부모 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 랭크 | 1 | · | · | · | · | · | · | · |
| 깊이 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
8. find(0)
뿌리는 0입니다. 부모를 0번 따라 올라갔습니다. 이미 뿌리를 바로 가리키고 있어 바꿀 것이 없었습니다.
| 원소 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 부모 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 랭크 | 1 | · | · | · | · | · | · | · |
| 깊이 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
9. find(0)
뿌리는 0입니다. 부모를 0번 따라 올라갔습니다. 이미 뿌리를 바로 가리키고 있어 바꿀 것이 없었습니다.
| 원소 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 부모 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 랭크 | 1 | · | · | · | · | · | · | · |
| 깊이 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
사용 방법
- 1원소 수를 넣습니다. 처음에는 저마다 혼자인 집합입니다.
- 2명령을 한 줄에 하나씩 적습니다. 「union 0 1」은 합치기, 「find 0」은 뿌리 찾기입니다.
- 3경로 압축과 랭크 합치기를 켜고 끄며 최대 깊이가 어떻게 달라지는지 봅니다.
- 4「최적화를 켜고 끄면」 표에서 네 가지 조합의 깊이와 걸음 수를 견줍니다.
- 5단계별 부모 배열에서 어느 뿌리가 어느 뿌리 밑에 붙는지 따라갑니다.
자주 묻는 질문
「이 둘이 같은 무리인가」를 아주 빠르게 답해야 할 때 씁니다. 원소마다 부모를 하나씩 두어 숲을 만들고 뿌리가 같으면 같은 무리로 보며, 합칠 때는 한쪽 뿌리를 다른 쪽 뿌리 밑에 붙입니다. 크루스칼 알고리즘에서 간선을 넣으면 사이클이 생기는지 판정하는 데 쓰이는 것이 대표적입니다.
최악의 경우 find 한 번이 O(n)이 됩니다. 최적화를 모두 끄고 union(0,1), union(1,2), union(2,3) …처럼 사슬로 이으면 부모가 한 줄로 늘어져 트리 높이가 원소 수 −1이 되기 때문입니다. 이 계산기의 「사슬로 잇기」 예제를 눌러 최적화를 끄면 그 모양을 그대로 볼 수 있습니다.
하나만 써도 크게 나아지지만 함께 쓸 때가 가장 좋습니다. 랭크 합치기만 쓰면 높이가 log₂n 아래로 눌리고, 경로 압축만 써도 한 번 훑은 길이 납작해집니다. 둘을 함께 쓰면 한 연산의 평균 비용이 역아커만 함수 α(n)에 비례해 현실의 어떤 n에서도 4를 넘지 않으며, 이것을 「거의 상수 시간」이라고 부릅니다.
정확히는 높이의 상한입니다. 경로 압축을 켜면 트리가 납작해지는데 랭크는 줄이지 않기 때문에, 압축 뒤의 랭크는 실제 높이보다 클 수 있습니다. 랭크를 줄이려면 트리 전체를 다시 살펴야 해서 이득보다 비용이 커지고, 상한으로 쓰는 데는 아무 문제가 없어 그대로 둡니다.
합치는 두 뿌리의 랭크가 같을 때뿐입니다. 랭크가 다르면 낮은 쪽을 높은 쪽 밑에 붙이므로 높이가 자라지 않고, 같을 때만 한쪽을 다른 쪽 밑에 붙이며 위쪽 랭크가 1 오릅니다. 랭크가 k인 트리를 만들려면 원소가 최소 2^k개 필요하다는 뜻이라, 여기서 높이가 log₂n 아래로 눌린다는 성질이 나옵니다.
붙이는 방향의 규약이 다르기 때문입니다. 이 계산기는 랭크 합치기를 끈 경우 a 쪽 뿌리를 b 쪽 뿌리 밑에 붙이고, 랭크가 같을 때는 b 쪽을 a 쪽 밑에 붙이며 a 쪽 랭크를 올립니다. 교재에 따라 반대로 적기도 하지만, 어느 규약에서든 「같은 집합인가」의 답과 집합의 개수는 같습니다.
전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.
알아두면 좋은 점
- 검증은 무작위 명령 300벌을 네 가지 최적화 조합으로 각각 돌려, 모든 원소 쌍에 대한 「같은 집합인가」의 답이 union을 간선으로 본 너비 우선 탐색의 답과 일치하는지 대조해 했습니다. 집합의 개수도 함께 맞췄습니다.
- 사슬 합치기에서 최적화를 모두 끄면 깊이가 원소 수 −1이 되고, 랭크 합치기를 켜면 깊이가 log₂n을 넘지 않으며, 둘 다 켜면 1이 되는 것을 테스트로 고정해 두었습니다.
- 랭크는 높이의 상한입니다. 경로 압축으로 트리가 납작해져도 랭크는 줄지 않습니다.
- 랭크 합치기를 끈 경우 a 쪽 뿌리를 b 쪽 뿌리 밑에 붙입니다. 교재에 따라 반대 규약을 쓰기도 하며, 그때 부모 배열의 모양은 달라도 집합 판정 결과는 같습니다.
- 원소 30개·명령 40줄까지 다룹니다. 부모 배열을 단계마다 모두 보이는 것이 목적이라 그보다 크면 화면이 읽히지 않습니다.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.