티스토리 뷰
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] 누적합 (Prefix Sum) (0) | 2023.02.13 |
---|---|
[알고리즘] 이분 그래프 (Bipartite Graph) (0) | 2023.02.09 |
[알고리즘] 동적프로그래밍 (DP, Dynamic Programming) (0) | 2023.01.20 |
[알고리즘 / Python] 이분 탐색 / 이진 탐색 (Binary Search) (0) | 2023.01.17 |
[알고리즘 / Python] 가장 긴 증가하는 부분 수열 (LIS) (0) | 2023.01.16 |
댓글
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
TAG
- 백준
- 누적합
- DP
- lis
- 파이썬
- 코드트리
- padding mask
- Prefix sum
- 이분 그래프
- Algorithm
- 트랜스포머
- python
- greedy
- 분리집합
- 1202
- 코딩테스트실력진단
- 수학
- COLAB
- 이분탐색
- 구현
- 알고리즘
- 그리디
- dfs
- boj
- 우선순위큐
- bipartite graph
- Look-ahead Mask
- Transformer
- disjoint set
- pytorch
링크