알고리즘
자료구조 - 힙(Heap)
BKM
2023. 4. 11. 14:15
힙(Heap)이란?
'완전 이진 트리'의 한 종류로, 최댓값이나 최솟값을 빠르게 찾아내기 위해 고안된 자료구조
완전 이진 트리란?
- 포화 이진 트리에서 오른쪽 부터 잎이 제거된 형태의 트리 자료구조
- 왼쪽 노드부터 채우는 형식
이진트리의 특성상, 부모 노드와 자식 노드간의 관계에는 일정한 규칙이 존재한다.
a라는 리스트가 있다고 가정할 때,
- a[i]의 자식 노드는 a[2i], a[2i+1]에 존재한다.
- a[j]의 부모 노드는 a[j//2]이다.
힙의 종류는 대표적으로 2가지가 존재한다.
- 최소 힙
- 부모 노드가 자식 노드보다 반드시 작은 값을 가져야 하는 힙 구조
- 최대 힙
- 부모 노드가 자식 노드보다 반드시 큰 값을 가져야 하는 힙 구조
ex) 13, 88, 112, 35, 49, 17 이 입력값으로 들어오는 경우(최소 힙),
- 순서대로 입력값을 트리에 삽입한다.
- 13-88-112-35-49-17
- 부모 노드가 자식 노드보다 큰 경우, 서로를 바꾼다.
- 13-35-112-88-49-17
- 13-35-17-88-49-112
위와 같이 힙 구조는 맨 앞에 오는 원소의 값이 반드시 최소 혹은 최대 값이 되므로 '우선순위 큐'를 사용한 알고리즘(e.g. Dijkstra)에 활용하기 적절하다.
Python에서 '최소 힙' 사용하기
Python에서는 built-in 라이브러리 heapq를 활용해 heap자료구조를 사용할 수 있다.import heapq
heapq.heappush
heap 구조를 가진 배열에 새로운 원소를 맨 마지막 자리에 집어넣고 최소 힙의 성질을 만족할때 까지 위치를 바꾼다.
heap = [3, 4, 6, 8, 5, 7] heapq.heappush(heap, 2) print(heap) # output : 2, 4, 3, 8, 5, 7, 6
heapq.heappop
heap 구조를 가진 배열에서의 최상위 노드를 추출하고, 재정렬 수행.
heap = [3, 4, 6, 8, 5, 7] data = heapq.heappop(heap) print(data) # output : 3 print(heap) # output : 4, 5, 8, 6, 7