개발/자료구조
[자료구조]힙(Heap)
grulsuitg
2022. 6. 28. 15:52
본문에서는 최소힙 (min heap) 기준으로 설명하도록 하겠습니다.
힙(Heap) 이란?
우선순위 큐를 구현하는데 주로 사용되는 자료구조로써 완전 이진트리로 구성되며 반정렬(느슨한 정렬) 상태입니다.
반정렬(느슨한 정렬)?
모든 노드가 자식 노드의 키 값보다는 크기가 작거나 같으며 부모 노드의 키 값보다는 크기가 큽니다.
크기가 가장 작은 값은 루트 노드에 있어야 합니다.
또한 힙에서는 중복된 값을 허용합니다.
힙(Heap)의 종류
- 최소 힙(Min Heap) - 부모 노드 key 값 <= 자식 노드 key 값
- 최대 힙(Max Heap) - 부모 노드 key 값 >= 자식 노드 key 값
힙(Heap)의 구현
heap은 완전 트리이기 때문에 배열로 구현할 수 있습니다.

위와 같은 힙이 있다고 할때 아래와 같은 배열로 나타낼 수 있습니다.

이 때 인덱스를 구성하는 성질이 있습니다.
- 루트 노드의 인덱스는 1로 한다.
- 자신의 index를 i라 할 때
왼쪽 자식의 index = 2 * i (2 * i <= n)
오른쪽 자식의 index = 2 * i + 1 (2 * i + 1 <= n) - 부모의 index = floor(i / 2) (i >= 2)
힙(Heap) 구조화- heapify
삽입과 삭제로 깨진 heap을 재구조화하는 heapify의 과정은 \(O(logN)\) 의 시간복잡도를 가지고 있습니다.
삽입(Inserttion) 과정

- 힙의 가장 마지막 노드에 새로운 노드를 삽입한다.
- 새로운 노드를 부모 노드들과 교환하며 힙의 성질을 만족시킨다.
삭제(Delete) 과정

- 루트 노드를 삭제한다.
- 가장 마지막 노드를 루트 노드 자리로 이동한다.
- 루트 노드로 옮긴 노드와 자식노드를 비교하며 힙 구조를 완성시킨다. (→Percolating-down)
단, 자식 노드 둘 다 부모 노드보다 크기가 작은 경우 자식 노드 중 더 작은 노드 쪽으로 이동한다.
힙(Heap) 만들기 - BuildHeap
힙 구조가 아닌 배열을 힙으로 만드는 과정입니다.
N개의 자료에 대하여 Heapify 과정 \(O(logN)\)을 거치기 때문에 시간 복잡도는 \(O(NlogN)\)이 됩니다.

- 가장 낮은 위치에 있는 자식이 있는 노드 부터 시작gkqslek.
- 루트노드방향으로 이동하며 자식노드를 비교하며 힙 구조를 완성시킵니다. ( → percolating-down)
참고 자료
- Fundamentals of Data Structures in C (2nd Edition)
- emplam27.log