Coding/자료구조
[자료구조] Heap
ryureeru
2022. 10. 8. 13:00
Heap
- 최솟값 or 최댓값을 빠르게 찾아내는 자료구조
- 완전 이진 트리
- 중복 값 허용
1. 최소 힙 (Min Heap)
- 부모 노드의 key가 자식 노드의 key보다 작거나 같은 형태
2. 최대 힙 (Max Heap)
- 부모 노드의 key가 자식 노드의 key보다 크거나 같은 형태
최소 힙 구현하기
1. 삽입
- 트리의 가장 끝 위치에 데이터 삽입
- -> 부모 노드와 key와 비교한 후 작을 경우 부모 자리와 교체
public void insert(int data) {
heap.add(data);
int cur = heap.size() - 1;
while (cur > 1 && heap.get(cur / 2) > heap.get(cur)) {
int parent = heap.get(cur / 2);
heap.set(cur / 2, data);
heap.set(cur, parent);
cur /= 2;
}
}
2. 삭제
- root 노드 반환 및 삭제
- -> 가장 마지막 위치의 노드를 root 노드로 위치시킴
- -> 자식 노드 중 작은 값과 비교 후 부모 노드가 더 크면 자리 교체 반복
public Integer delete() {
if (heap.size() == 1) { // root 노드를 1부터 설정함
System.out.println("empty");
return null;
}
int root = heap.get(1);
heap.set(1, heap.get(heap.size() - 1));
heap.remove(heap.size() - 1);
int cur = 1;
while (true) {
int left = cur * 2;
int right = cur * 2 + 1;
int target = -1;
if (right < heap.size()) {
target = heap.get(left) < heap.get(right) ? left : right;
} else if (left < heap.size()) {
target = cur * 2;
} else {
break;
}
if (heap.get(cur) > heap.get(target)) {
int parent = heap.get(cur);
heap.set(cur, heap.get(target));
heap.set(target, parent);
cur = target;
} else {
break;
}
}
return root;
}
}