Heap
- Heap은 완전 이진트리를 기반으로 한다.
- 최대 힙(Max Heap)은 루트 노드로 올라갈수록 저장된 값이 커지는 구조이다.
- 최소 힙(Min Heap)은 루트 노드로 올라갈수록 저장된 값이 작아지는 구조이다.
- 최대 힙이든 최소 힙이든 모든 부모 노드의 우선순위는 자식 노드보다 크거나 같다.
- 구현의 용이함을 위해 root index는 1부터 시작한다.
- 위 조건을 만족하며 완전이진트리 형태로 채워나가면 된다. 즉, 형제노드간 우선순위는 고려하지 않아도 된다.
Heap의 부모 노드와 자식 노드간 관계
- 부모 노드의 index = (왼쪽 자식 index) / 2
- 왼쪽 자식 index = (부모 index) * 2
- 오른쪽 자식 index = (부모 index) * 2 + 1
새로운 노드 추가 시
- 새로운 노드를 힙의 마지막 노드에 삽입한다. (우선순위를 제일 낮게)
- 부모 노드들과 우선순위를 비교하며 교환 반복.
노드 삭제 시
- 루트 노드를 삭제한다. (우선순위가 제일 높기 때문)
- 삭제된 자리로 Heap의 마지막 노드를 가져온다.
- 자식 노드들 중 더 우선순위가 높은 자식노드와 교환하며 이를 반복해 Heap을 재구성한다.
- Heap은 Priority Queue를 구현하는데 사용된다.
- Priority Queue를 배열이나 연결리스트로 구현하게 되면 삭제 시 시간복잡도 O(1), 삽입 시 시간복잡도가 O(n)이 된다.
- 반면 Heap을 이용해 구현할 경우 부모-자식간의 비교만 진행되기 때문에 삭제 시 시간복잡도 O(log2n), 삽입 시 시간복잡도 O(log2n)이 된다.
- 따라서 삽입과 삭제의 편차가 덜한 Heap으로 구현.
- Java의 Priority Queue는 기본적으로 부모 노드의 key 값이 자식 노드의 key 값보다 작거나 같은 최소 힙(Min Heap)을 사용한다. (작을수록 우선순위가 높다)
'[Java] > 문법, 자료구조, 알고리즘' 카테고리의 다른 글
StringTokenizer (0) | 2023.03.25 |
---|---|
좌표 정렬 (0) | 2023.03.24 |
Stack / Queue (0) | 2023.03.20 |
Scanner vs BufferedReader (0) | 2023.03.16 |
TreeSet, Red-Black Tree (0) | 2023.03.10 |