Min Heap vs Max Heap When to Use Which in DSA Javascript - Complexity Comparison
We want to understand how fast operations run in Min Heaps and Max Heaps.
Which heap is better depends on what we want to do with the data.
Analyze the time complexity of inserting and removing elements in Min and Max Heaps.
class Heap {
constructor(compare) {
this.data = [];
this.compare = compare;
}
insert(value) {
this.data.push(value);
this.bubbleUp();
}
bubbleUp() {
let index = this.data.length - 1;
while (index > 0) {
let parentIndex = Math.floor((index - 1) / 2);
if (this.compare(this.data[index], this.data[parentIndex])) {
[this.data[index], this.data[parentIndex]] = [this.data[parentIndex], this.data[index]];
index = parentIndex;
} else {
break;
}
}
}
remove() {
if (this.data.length === 0) return null;
const root = this.data[0];
const end = this.data.pop();
if (this.data.length > 0) {
this.data[0] = end;
this.bubbleDown();
}
return root;
}
bubbleDown() {
let index = 0;
const length = this.data.length;
const element = this.data[0];
while (true) {
let leftChildIndex = 2 * index + 1;
let rightChildIndex = 2 * index + 2;
let swapIndex = null;
if (leftChildIndex < length) {
if (this.compare(this.data[leftChildIndex], element)) {
swapIndex = leftChildIndex;
}
}
if (rightChildIndex < length) {
if (
(swapIndex === null && this.compare(this.data[rightChildIndex], element)) ||
(swapIndex !== null && this.compare(this.data[rightChildIndex], this.data[leftChildIndex]))
) {
swapIndex = rightChildIndex;
}
}
if (swapIndex === null) break;
[this.data[index], this.data[swapIndex]] = [this.data[swapIndex], this.data[index]];
index = swapIndex;
}
}
}
// Min Heap: compare = (a, b) => a < b
// Max Heap: compare = (a, b) => a > b
This code shows how insertion and removal work in both Min and Max Heaps using a comparison function.
We look at the main repeated steps in the code.
- Primary operation: The
bubbleUpandbubbleDownloops that move elements up or down the tree. - How many times: At most, they run once per level of the heap, which is about log of the number of elements.
As the heap grows, the number of levels increases slowly.
| Input Size (n) | Approx. Operations (bubbleUp or bubbleDown steps) |
|---|---|
| 10 | About 3 to 4 steps |
| 100 | About 6 to 7 steps |
| 1000 | About 9 to 10 steps |
Pattern observation: The steps grow slowly, roughly adding one step each time the input size multiplies by 2.
Time Complexity: O(log n)
This means inserting or removing an element takes time that grows slowly as the heap gets bigger.
[X] Wrong: "Min Heap and Max Heap have different time complexities for insert and remove."
[OK] Correct: Both heaps use the same structure and operations, so their time complexities are the same; only the comparison direction changes.
Knowing when to use Min or Max Heap and understanding their time costs helps you solve problems efficiently and explain your choices clearly.
What if we changed the heap to a balanced binary search tree? How would the time complexity for insert and remove compare?