이진 힙
이진검색트리와 유사하지만 다른 규칙이 존재한다.
- 최대이진힙(MaxBinaryHeap)에서는, 부모노드가 자식노드보다 항상 크다.
- 최소이진힙(MinBinaryHeap)에서는, 부모노드가 자식노드보다 항상 작다.
- 각 노드의 자식은 왼쪽부터 채워지며 가능한 모두 채워야 한다.
사용처
- 자료구조에서 흔히 사용되는 우선순위 큐를 구현하는데 사용한다.
- 그래프 순회 알고리즘에서도 꽤 사용된다.
표현
배열로 표현할 수 있다.
- 어느 n번째 인덱스 노드의 자식노드 중 왼쪽은
2n + 1
인덱스에, 오른쪽은2n + 2
에 존재한다. - 어느 n번째 인덱스 노드의 부모노드는
(n-1)/2
에 존재한다. (소수점 버림)
최대이진힙에 추가하기
- 배열의 맨 끝에 추가한다.
- 부모와 비교하며 자신이 더 작을 때까지 끌어올린다.
최댓값 추출하기
- 배열의 첫 값과 마지막 값을 교환하고 배열의 마지막 요소를 뽑아 반환 값으로 한다.
- 새로운 루트 노드를 자식과 비교하여 본인의 위치까지 끌어내린다.
- 왼쪽과 오른쪽 자식 값을 찾는다. (
2n + 1
,2n + 2
) - 현재 노드보다 큰 자식과 위치를 바꾼다.
- 두 자식이 모두 크다면 더 큰 자식쪽으로 위치를 바꾼다.
- 왼쪽과 오른쪽 자식 값을 찾는다. (
최소이진힙
- 최대이진힙의 추가, 추출의 반대로 진행 (작은게 루트 쪽으로)
이진힙의 시간복잡도
- 삽입: O(log N)
- 삭제: O(log N)
- 검색: O(N)
우선순위 큐
각 요소들이 우선순위를 가지는 자료구조이다. 우선순위가 높은 요소가 그렇지 않은 요소보다 먼저 위치한다. 최대이진힙 또는 최소이진힙으로 구현한다.