[algorithm] 힙(heap) 이란?

1 분 소요

자료구조 힙(heap)이란?

먼저 완전 이진 트리 가 무엇인지 알아보자. 완전 이진 트리 는 데이터 루트(Root) 노드부터 시작해서 자식 노드가 왼쪽, 오른쪽 노드로 차근차근 들어가는 구조의 이진 트리 이다.

힙(heap) 은 이 완전 이진 트리를 이용하여 최솟값이나 최댓값을 빠르게 찾아낼 수 있는 자료구조이다.

힙(heap)의 종류

  • 최대 힙(Max Heap)
    • 부모 노드의 키 값이 자식 노드의 키 값보다 크거나 같은 완전 이진트리
    • key(부모 노드) >= key(자식 노드)
  • 최소 힙(Min Heap)
    • 부모 노드의 키 값이 자식 노드의 키 값보다 작거나 같은 완전 이진트리
    • key(부모 노드) <= key(자식 노드)

힙(heap)의 구현

배열을 이용하여 편의를 위하여 1번 인덱스부터 작성한다. 힙에서 부모 노드와 자식 노드의 관계

  • 왼쪽 자식 노드 인덱스 = (부모 인덱스) * 2
  • 오른쪽 자식 노드 인덱스 = (부모 인덱스) * 2 + 1
  • 부모 인덱스 = (자식 노드) / 2

)

)

#include<cstdio>

int num = 9;
int heap[9] = { 7,6,5,8,3,5,9,1,6 };

int main() {
	//트리 구조를 최대 힙 구조로 바꿈
	for (int i = 1; i < num; i++) {
		int c = i;
		do {
			int root = (c - 1) / 2;
			if (heap[root] < heap[c]) {
				int tmp = heap[root];
				heap[root] = heap[c];
				heap[c] = tmp;
			}
			c = root;
		} while (c != 0);
	}
	//크기를 줄여가며 반복적으로 힙 구성
	for (int i = num - 1; i >= 0; i--) {
		int tmp = heap[0];
		heap[0] = heap[i];
		heap[i] = tmp;
		int root = 0;
		int c = 1;
		do {
			c = 2 * root + 1;
			//자식 중에 큰 값을 찾기
			if (heap[c] < heap[c + 1] && c < i - 1) {
				c++;
			}
			// 루트 보다 자식이 크다면 교환
			if (c < i&&heap[root] < heap[c]) {
				tmp = heap[root];
				heap[root] = heap[c];
				heap[c] = tmp;
			}
			root = c;
		} while (c < i);
	}
	for (int i = 0; i < num; i++)
		printf("%d ", heap[i]);

	return 0;
}

참조 :

댓글남기기