하루에 한 문제

힙 (Heap) 본문

CS/자료구조

힙 (Heap)

dkwjdi 2021. 3. 15. 00:41

힙이란?
완전 이진 트리의 일종으로 우선순위 큐를 위하여 만들어진 자료구조이다.
여러 개의 값들 중에서 최댓값이나 최솟값을 빠르게 찾아내도록 만들어진 자료구조이다.
힙은 일종의 반정렬 상태(느슨한 정렬 상태) 를 유지한다.
큰 값이 상위 레벨에 있고 작은 값이 하위 레벨에 있다는 정도
간단히 말하면 부모 노드의 키 값이 자식 노드의 키 값보다 항상 큰(작은) 이진 트리를 말한다.
힙 트리에서는 중복된 값을 허용한다. (이진 탐색 트리에서는 중복된 값을 허용하지 않는다.)

완전이진트리

  • 힙의 종류

최대힙 혹은 최소힙을 만족해야한다.

최대힙(max heap property) : 부모는 자식보다 크거나 같다. → 최대값을 찾는데 시간복잡도 O(1)

최소힙(min heap property) : 부모는 자식보다 작거나 같다. → 최소값을 찾는데 시간복잡도 O(1)

힙의 구현

힙을 저장하는 표준적인 자료구조는 배열 이다.
구현을 쉽게 하기 위하여 배열의 첫 번째 인덱스인 0은 사용되지 않는다.
특정 위치의 노드 번호는 새로운 노드가 추가되어도 변하지 않는다.
예를 들어 루트 노드의 오른쪽 노드의 번호는 항상 3이다.


힙에서의 부모 노드와 자식 노드의 관계
왼쪽 자식의 인덱스 = (부모의 인덱스) * 2
오른쪽 자식의 인덱스 = (부모의 인덱스) * 2 + 1
부모의 인덱스 = (자식의 인덱스) / 2

 

힙의 삽입

힙에 새로운 요소가 들어오면, 일단 새로운 노드를 힙의 마지막 노드에 이어서 삽입한다

새로운 노드를 부모 노드들과 교환해 힙의 성질을 만족한다.

 

 

힙의 삽입

최대 힙에서 최댓값은 루트 노드이므로 루트 노드가 삭제된다.

삭제된 루트 노드에는 마지막 노드를 가져온다.

힙을 재구성한다.

 

 

참고

github.com/gyoogle/tech-interview-for-developer/blob/master/Computer%20Science/Data%20Structure/Heap.md

gmlwjd9405.github.io/2018/05/10/data-structure-heap.html

gist.github.com/Baekjoon/5b1349b9159e7548bb54

'CS > 자료구조' 카테고리의 다른 글

카운팅 정렬(Counting sort)  (0) 2021.03.17
버블 정렬(bubble sort)  (0) 2021.03.16
삽입정렬(Insertion sort)  (1) 2021.03.16
선택정렬(Selection sort)  (0) 2021.03.16
이진탐색트리 (Binary Search Tree)  (0) 2021.03.15
Comments