일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Python
- BAM
- 하이퍼바이저
- 물걸레자동세척로봇청소기
- 신경망
- Bidirectional Associative Memory
- 구글 앱 엔진
- 빅데이터
- 삼성
- 증강현실
- 신경회로망
- 파이썬
- Friendship
- 인공지능
- Google App Engine
- 가상화
- hopfield network
- 갤럭시탭S8울트라
- 삼성전자 소프트웨어멤버십 SSM
- 고려대학교
- 삼성소프트웨어멤버십
- NarwalFreo
- Neural Network
- 패턴 인식
- 동아리
- 패턴인식
- 나르왈프레오
- SSM
- 멤버십
- 물걸레로봇청소기추천
- Today
- Total
정보공간_1
[6기 강남 조유석] Union-Find 본문
안녕하세요. 강남멤버십 23-1기 조유석입니다.
이번 포스팅에서는 상호 배타적 집합(disjoint set)을 표현할 때 쓰는 Union-Find라는 독특한 형태의 자료구조를 알아보겠습니다.
Union-Find
Union-Find 트리는 공통 원소가 없는, 다시 말해 상호 배타적인 부분 집합들로 나눠진 원소들에 대한 정보를 저장하고 조작하는 자료구조 입니다. Union-Find 트리는 주어진 원소들이 서로 같은 그룹에 속해 있는지가 중요합니다. 다음 그림과 같이 하나의 그룹은 하나의 트리이며, 어떤 노드가 어떤 노드의 부모인가 등이 중요한 것이 아니라 연결성을 중요시 합니다.
Union-Find 트리는 초기화, 합치기(Union), 찾기(Find) 이 세 가지 연산을 지원하며, 이 때 합치기(Union), 찾기(Find)의 두 연산을 지원한다고 해서 이 자료구조를 Union-Find 라고 부릅니다.
초기화
n개의 원소가 각각의 집합에 포함되어 있도록 초기화합니다.
Union
두 원소가 주어질 때 이들이 속한 두 집합을 하나로 합칩니다. 다음 그림과 같이 한 트리의 루트(그림에서 1)로부터 다른 트리의 루트(그림에서 5)에 선을 연결하면 2개의 트리가 1개의 트리가 되어 1개의 그룹이 됩니다.
Find
어떤 원소가 속한 집합을 반환합니다. 같은 그룹에 속해 있는지를 판정하는데는 그 요소가 포함되어 있는 트리의 루트를 조사합니다. 같은 루트라면 같은 그룹이라는 것을 알 수 있습니다. 다음 그림에서 6과 7은 모두 5에 도달하기 때문에 같은 그룹에 속해있음을 알 수 있습니다. 또한 2와 3은 모두 1에 도달하기 때문에 6이나 7과는 다른 그룹에 속해있음을 알 수 있습니다.
- 각 트리에 대해 트리의 높이(rank)를 기억해 둔다.
- Union 시 2개의 트리의 rank가 다르면 rank가 작은 쪽에서 큰 쪽으로 Union 한다.
이 최적화를 이용하면 높이가 h인 트리가 생기기 위해서는 높이가 h-1개인 두 개의 트리가 합쳐져야 합니다. 트리의 높이가 h-1이기 위해 최소 x개의 노드가 필요하다면, 높이가 h가 되기 위해서는 최소 2x개의 노드가 필요합니다. 따라서 트리의 높이는 노드의 수의 로그에 비례하며, Union 연산, Find 연산의 시간복잡도는 이 아니라 이 됩니다.
path compression
Find를 실행한 노드에서 거쳐간 모든 노드를 루트에 연결합니다. 이후부터는 이 노드들에 대해서는 바로 루트를 알 수 있습니다.
두 가지 최적화를 모두 적용한 Union-Find의 수행 시간은 으로 알려져 있습니다. 이것은 보다 고속으로 동작하며, 현실적인 모든 입력에 대해 상수시간에 동작한다고 봐도 좋습니다.
Union-Find 구현
Union-Find로 문제를 해결하는 대표적 사례로는 Kruskal의 Minimum Spanning Tree 알고리즘이 있으며, 이 외에도 Union-Find에 다른 정보를 추가함으로써 해결할 수 있는 문제들이 많습니다.
이상으로 Union-Find 에 대해 알아보았습니다.
감사합니다.
Reference
- ‘프로그래밍 대회에서 배우는 알고리즘 문제해결 전략’ - 구종만 저
- ‘프로그래밍 콘테스트 챌린징’ - Takuya Akiba, Yoichi Iwata, Masatoshi Kitagawa 저
'IT 놀이터 > Elite Member Tech & Talk' 카테고리의 다른 글
[6기 대구 허정욱] EasyHook - Windows API Hooking (0) | 2014.10.06 |
---|---|
[6기 강남 송태현] android Framework Notifiacation & NotifyService 분석 (0) | 2014.10.04 |
[6기 강북 이보희] 디지털 영상처리 - Filter 편 #1 (1) | 2014.09.18 |
[6기 신촌 김윤상] R 언어 #2 - Data Analysis에 최적화된 R 언어 알아보기 (0) | 2014.09.16 |
[6기 신촌 류보원] 체감형 게임 - 오큘러스 리프트 연동 (0) | 2014.09.15 |