-
728x90
- Union Find : 두 노드가 같은 그래프에 속하는지 판별하는 알고리즘 (서로소 집합을 찾아내는 알고리즘)
- 노드를 합치는 Union연산과 노드의 루트 노드를 찾는 Find연산으로 이루어짐
- 코테 활용
- Union Find를 활용하여 양방향 그래프에서 cycle 여부를 판단할 수 있다.
- 각 간선의 두 노드의 루트 노드를 확인한다.
- 루트노드가 서로 다르면 union 연산 실행
- 루트노드가 서로 같으면 cycle 발생한 것
- 각 간선의 두 노드의 루트 노드를 확인한다.
- Union Find를 활용하여 양방향 그래프에서 cycle 여부를 판단할 수 있다.
arr = [i for i in range(N+1)]
def union(a,b): a_root = find(a) b_root = find(b) arr[a_root] = b_root
- 경로압축-최적화 코드
def find(a): if arr[a]==a : return a else: arr[a]=find(arr[a]) return arr[a]
- 최적화 전 코드
- 이 버전에서는 arr[a]를 직접 갱신하지 않고, 단순히 재귀적으로 루트 노드를 찾아 반환합니다.
- 이 방식은 함수가 호출될 때마다 매번 루트 노드까지 재귀적으로 탐색해야 하므로, 깊이가 깊은 트리에서는 비효율적일 수 있습니다.
- 이 버전에서는 arr[a]를 직접 갱신하지 않고, 단순히 재귀적으로 루트 노드를 찾아 반환합니다.
def find(a): if arr[a] == a: return a else: return find(arr[a])
- 유니온 파인드의 시간 복잡도는 구하기가 꽤 까다롭다.
- 최적화 여부, 순서 등에 따라 매번 달라지기 때문이다.
- 코드를 살펴보면 전체 시간 복잡도와 Union 함수의 시간 복잡도는 Find 함수의 시간 복잡도에 따라 결정되는 것을 알 수 있다.
- 경로 압축 최적화를 하지 않은 경우,
- 트리가 한 쪽으로 치우칠 수 있기 때문에 Find 함수의 시간 복잡도는 **최악의 경우 O(N)**이다.
- 경로 압축 최적화를 한 경우,
- 트리가 짧고 넓은 형태가 될 가능성이 높아지므로 O(logN) 정도로 생각할 수 있겠다.
3. 관련 문제 풀이
https://github.com/AAISSJ/AlgorithmStudy/tree/main/2024/Data%20Structure/Tree%26Graph/Union%20Find
728x90'Data Structure & Algorithms' 카테고리의 다른 글
2024 자료구조개론 & 알고리즘개론 정리 - 1. 배열과 링크드리스트 (0) 2024.04.16 [Algorithms/python] 정렬 알고리즘 총정리 (quick sort, merge sort, ) (0) 2024.04.03 [Algorithms/python] 위상 정렬(Topological Sort) (0) 2024.04.02 2024 알고리즘 공부 순서 - 코딩테스트 및 면접 대비 (2) 2024.03.23 2024 상반기 삼성 SDS 알고리즘 특강 - 수강 후기 (0) 2024.03.09