힙(Heap)은 최대값이나 최소값을 빠르게 찾기 위해 고안된 완전 이진 트리(Complete Binary Tree) 이다. 완전 이진 트리란 노드를 삽입할 때 최하단 왼쪽 노드부터 차례대로 삽입하는 트리를 말한다. 최대값을 구하기 위한 최대 힙(Max Heap)과 최소값을 구하기 위한 최소 힙(Min Heap) 으로 분류되고, 최대 힙의 경우 각 노드의 값은 해당 노드의 자식 노드가 가진 값보다 크거나 같고 최소 힙은 그 반대이다.
힙은 배열을 이용해 구현할 수 있고, 편의를 위해 0번 인덱스 대신 1번 인덱스를 루트 노드로 지정한다.
- 부모 노드 인덱스 번호 = 자식 노드 인덱스 번호 // 2
- 왼쪽 자식 노드 인덱스 번호 = 부모 노드 인덱스 번호 * 2
- 오른쪽 자식 노드 인덱스 번호 = 부모 노드 인덱스 번호 * 2 + 1
이진 탐색 트리(Binary Search Tree)의 경우, 작은 값은 왼쪽 자식 노드로, 큰 값은 오른쪽 자식 노드로 보내는 조건이 있다. 따라서 이진 탐색 트리의 가장 왼쪽 자식이 최소값이고 가장 오른쪽 자식이 최대값이다. 반면에 힙의 자식 노드는 오른쪽이 클 수도 있고 왼쪽이 클 수도 있다. 이진 탐색 트리는 탐색을 위한 구조, 힙은 최대/최소값을 찾기 위한 구조로 이해하면 된다.
< 힙 구현하기 >
* 시간 복잡도
트리의 높이(Depth)를 ℎ 라고 한다면, 힙의 시간 복잡도는 O(ℎ) 이다. n 개의 노드를 가지는 힙에 데이터 삽입 또는 삭제시 최악의 경우 ℎ=𝑙𝑜𝑔𝑛 에 가까우므로 O(𝑙𝑜𝑔𝑛) 이라고 말할 수 있다.
'자료구조 & 알고리즘' 카테고리의 다른 글
[파이썬] 재귀 호출 (Recursive Call) (0) | 2021.03.21 |
---|---|
[파이썬] 버블 정렬, 삽입 정렬, 선택 정렬 구현하기 (0) | 2021.03.20 |
[파이썬] 이진 탐색 트리(Binary Search Tree) 직접 구현하기 (0) | 2021.03.17 |
[파이썬] Hash Table 구현과 Hash Collision 해결 기법 (0) | 2021.03.16 |
[파이썬] Linked List, Doubly Linked List 직접 구현하기 (0) | 2021.03.16 |