티스토리 뷰
728x90
반응형
1. 분리집합 (Disjoint Set)
- 분리집합은 서로 겹치는 원소가 없는 상호 배타적인 집합들을 의미하며 서로소 집합이라고도 불린다.
- 전체 집합에 대하여 겹치지 않는 두 개 이상의 부분 집합이라 할 수 있다.
- 즉, 분리집합 알고리즘은 각 원소가 속하는 부분 집합을 찾아 분리를 하는 것이다.
- 예를 들어, 전체 집합 U에 대하여 짝수 집합 A와 홀수 집합 B는 서로 겹치는 원소가 없는 부분 집합들로 분리집합이라 할 수 있다.
2. Union-Find 알고리즘
- 시간복잡도: 평균적으로 O(logN)이며, 최악의 경우에는 O(n)이다.
- 트리구조를 사용한다. 하지만 이때, 자식노드가 부모노드 가리킨다는 것에 차이가 있다.
- 두 개 노드가 있을 때, 서로 같은 집합에 있는지 아닌지 판별하는 알고리즘이다.
- Find 함수는 루트를 찾아들어가 x노드가 속한 집합을 찾는 역할을 한다.
- Union 함수는 x노드와 y노드의 집합을 합치는 역할을 한다.
- 마지막까지도 합쳐지지 않는 노드들이 있다는 것은 서로 겹치지 않는 집합이 존재한다는 것을 의미한다.
2.1. Find 함수
parent = list(range(n+1)) # 초기화
def find(x):
# 자신이 루트이면 자기 자신 반환
if x == parent[x]:
return x
# 자신이 루트가 아니면 부모를 루트로 만듦
else:
parent[x] = find(parent[x])
return parent[x]
2.2. Union 함수
# 기본
def union(x,y):
# 부모 노드 탐색
x = find(x)
y = find(y)
# 부모를 합칠 때 더 작은 값 쪽으로 합침
if y < x:
parent[x] = y
else:
parent[y] = x
# rank 사용
rank = list(range(n+1))
def union(x,y):
# 부모 노드 탐색
x = find(x)
y = find(y)
if x == y:
return
# 부모를 합칠 때 더 작은 값 쪽으로 합침
if rank[x] < rank[y]:
a, b = y, x
else:
a, b = x, y
if rank[x] == rank[y]:
rank[b] += 1
parent[a] = b
728x90
반응형
'Study > Algorithm' 카테고리의 다른 글
[Python / 알고리즘] Flood Fill 알고리즘 (0) | 2024.11.10 |
---|---|
[알고리즘 / Python] 최소신장트리 (크루스칼 알고리즘) (0) | 2023.04.14 |
[알고리즘 / Python] 누적합 (Prefix Sum) (0) | 2023.02.13 |
[알고리즘] 이분 그래프 (Bipartite Graph) (0) | 2023.02.09 |
[알고리즘 / Python] 동적프로그래밍 (DP, Dynamic Programming) (0) | 2023.01.20 |
댓글