반응형
최소 힙(Min Heap) 구현
class MinHeap {
constructor() {
this.heap = [];
}
insert(v) {
this.heap.push(v);
this.heapUp();
}
remove() {
if (this.size() === 1) return this.heap.pop();
if (this.size() === 0) return null;
const v = this.heap[0];
this.heap[0] = this.heap.pop();
this.heapDown();
return v;
}
heapUp() {
let child = this.size() - 1;
while (child > 0) {
const parent = this.getParent(child);
if (this.heap[child] >= this.heap[parent]) break;
this.swap(child, parent);
child = parent;
}
}
heapDown() {
let parent = 0;
while (true) {
const left = this.getLeftChild(parent);
const right = this.getRightChild(parent);
let smallest = parent;
if (this.isValidChild(left) && this.heap[smallest] > this.heap[left])
smallest = left;
if (this.isValidChild(right) && this.heap[smallest] > this.heap[right])
smallest = right;
if (smallest === parent) break;
this.swap(parent, smallest);
parent = smallest;
}
}
size() {
return this.heap.length;
}
isEmpty() {
return this.size() === 0;
}
swap(a, b) {
[this.heap[a], this.heap[b]] = [this.heap[b], this.heap[a]];
}
getParent(child) {
return Math.floor((child - 1) / 2);
}
getLeftChild(parent) {
return parent * 2 + 1;
}
getRightChild(parent) {
return parent * 2 + 2;
}
isValidChild(index) {
return index < this.size();
}
}