이숭간 공부기록
[자료구조] 힙(Heap) 본문
728x90
출처 : gmlwjd9405.github.io/2018/05/10/data-structure-heap.html를 참고하여 작성하였습니다.
" 우선순위 큐를 위해 만들어진 자료구조 "
(우선순위 큐가 뭔데요? 우선순위의 개념을 큐에 도입한 자료구조로서, 우선순위가 높은 데이터가 큐에서 먼저 나가게 된다.)
1. 힙이란?
- 완전 이진트리의 일종으로 우선순위 큐를 위해 만들어진 자료구조
- 여러개의 값중 최댓값이나 최솟값을 빠르게 찾아내도록 고안됨
- 부모노드의 키값이 자식노드의 키값보다 항상 크거나(혹은 작은) 이진트리이다.
- 힙 트리에서는 중복된 값을 허용한다.
2. 힙의 종류
- 최대힙 (Max Heap)
- key(부모) >= key(자식)
- 숫자로 생각하면 큐에서 나가는 순서가 내림차순이 되는것이다.
- 최소힙 (Min Heap)
- key(부모) <= key(자식)
- 숫자로 생각하면 큐에서 나가는 순서가 오름차순이 되는것이다.
- 노드간 키값의 대소관계는 부모/자식간에만 성립하고, 형제노드 사이에는 대소관계가 정해지지 않는다!
3. 힙의 구현
- 배열에 힙을 저장한다. (노드번호는 1부터 시작하므로 쉬운구현을 위해 0번째 인덱스는 사용하지 않는다.)
- 특정위치의 노드번호는 변하지 않는다.
4. 힙의 삽입, 삭제
- 삽입
- 힙에 새로운 요소가 들어오면 새로운 노드를 힙의 마지막 노드에 이어서 삽입한다.
- 새로운 노드를 부모노드와 교환해서 힙의 성질을 만족시킨다.
- 자바코드
void insert_max_heap(int x) {
maxHeap[++heapSize] = x; // 힙크기 하나 증가후 새로운노드 삽입
for (int i=heapSize; i>1; i/=2) { // 자식노드가 왼쪽이든 오른쪽이든 부모노드는 자식노드를 2로나눈것의 몫이므로
if (maxHeap[i/2] < maxHeap[i]){
swap(i/2, i);
} else {
break;
}
}
}
- 삭제
- 최대힙에서 최댓값은 루트노드이므로 루트노드가 삭제된다.
- 삭제된 루트노드의 빈자리에는 최대힙의 마지막 노드를 가져온다.
- 힙을 재구성한다.
힙 관련 백준 알고리즘문제 :
출처 : gmlwjd9405.github.io/2018/05/10/data-structure-heap.html
'알고리즘 > 알고리즘 기초공부' 카테고리의 다른 글
동빈나 2021 이코테 _ 8.기타 그래프이론 (union-find, kruskal, topology sort) (0) | 2021.04.01 |
---|---|
2차원배열 자꾸 헷갈리는거,,, (0) | 2021.03.24 |
동빈나 2021 이코테 _ 7. 최단경로 알고리즘 (플로이드 워셜) (0) | 2021.03.20 |
동빈나 2021 이코테 _ 7. 최단경로 알고리즘 ( 다익스트라) (0) | 2021.03.20 |
동빈나 2021 이코테 _ 6. 다이나믹 프로그래밍 (0) | 2021.02.17 |