Bird
Raised Fist0
Data Structures Theoryknowledge~5 mins

Heap extraction (bubble down) in Data Structures Theory - Time & Space Complexity

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Time Complexity: Heap extraction (bubble down)
O(log n)
Understanding Time Complexity

When we remove the top item from a heap, we need to restore its order. This process is called bubble down.

We want to know how the time to do this grows as the heap gets bigger.

Scenario Under Consideration

Analyze the time complexity of the following heap extraction code.


function heapExtract(heap) {
  if (heap.size === 0) return null;
  const top = heap[0];
  heap[0] = heap[heap.size - 1];
  heap.size--;
  bubbleDown(heap, 0);
  return top;
}

function bubbleDown(heap, index) {
  let left = 2 * index + 1;
  let right = 2 * index + 2;
  let smallest = index;
  if (left < heap.size && heap[left] < heap[smallest]) smallest = left;
  if (right < heap.size && heap[right] < heap[smallest]) smallest = right;
  if (smallest !== index) {
    [heap[index], heap[smallest]] = [heap[smallest], heap[index]];
    bubbleDown(heap, smallest);
  }
}
    

This code removes the top element from a min-heap and restores heap order by moving the new root down.

Identify Repeating Operations

Look at what repeats during bubble down.

  • Primary operation: Comparing and swapping the current node with its smaller child.
  • How many times: At most once per level of the heap, moving down from root to leaf.
How Execution Grows With Input

Each bubble down step moves one level down the heap tree.

Input Size (n)Approx. Operations
10About 3 to 4 steps
100About 6 to 7 steps
1000About 9 to 10 steps

Pattern observation: The number of steps grows slowly, roughly with the height of the heap, which increases as the logarithm of n.

Final Time Complexity

Time Complexity: O(log n)

This means the time to restore heap order grows slowly as the heap size grows, increasing by about one step each time the heap size doubles.

Common Mistake

[X] Wrong: "Bubble down takes the same time no matter the heap size because it just swaps a few elements."

[OK] Correct: The number of swaps depends on the heap height, which grows with the size of the heap, so bigger heaps can take more steps.

Interview Connect

Understanding how bubble down works and its time cost helps you explain heap operations clearly and shows you know how data structures behave as they grow.

Self-Check

"What if the heap was a max-heap instead of a min-heap? How would the time complexity of bubble down change?"

Practice

(1/5)
1. What is the main purpose of the bubble down operation during heap extraction?
easy
A. To restore the heap property after removing the root element
B. To insert a new element at the bottom of the heap
C. To find the maximum element in the heap
D. To sort all elements in the heap

Solution

  1. Step 1: Understand heap extraction

    Heap extraction removes the root element, which may break the heap property.
  2. Step 2: Role of bubble down

    Bubble down swaps the root with its smaller child repeatedly to restore the heap order.
  3. Final Answer:

    To restore the heap property after removing the root element -> Option A
  4. Quick Check:

    Bubble down fixes heap after root removal = D [OK]
Hint: Bubble down fixes heap after root removal [OK]
Common Mistakes:
  • Confusing bubble down with insertion
  • Thinking bubble down sorts the entire heap
  • Believing bubble down finds max element
2. Which of the following correctly describes the condition to continue bubbling down in a min-heap?
easy
A. While the current node is larger than both children
B. While the current node is larger than at least one child
C. While the current node is smaller than both children
D. While the current node is equal to its children

Solution

  1. Step 1: Understand min-heap property

    In a min-heap, parent nodes must be smaller than their children.
  2. Step 2: Bubble down condition

    Bubble down continues while the current node is larger than at least one child, to swap with the smaller child.
  3. Final Answer:

    While the current node is larger than at least one child -> Option B
  4. Quick Check:

    Bubble down if parent > any child = C [OK]
Hint: Bubble down if parent bigger than any child [OK]
Common Mistakes:
  • Stopping bubble down too early
  • Swapping with larger child instead of smaller
  • Confusing min-heap with max-heap conditions
3. Given the min-heap array [2, 5, 3, 10, 7], what is the array after extracting the root and performing bubble down?
medium
A. [5, 7, 3, 10]
B. [3, 7, 5, 10]
C. [3, 5, 7, 10]
D. [5, 3, 7, 10]

Solution

  1. Step 1: Remove root and replace with last element

    Remove 2, replace root with 7: [7, 5, 3, 10]
  2. Step 2: Bubble down to restore heap

    Compare 7 with children 5 and 3; swap with smaller child 3: [3, 5, 7, 10]
  3. Final Answer:

    [3, 5, 7, 10] -> Option C
  4. Quick Check:

    Bubble down swaps root with smaller child = A [OK]
Hint: Replace root with last, then swap down smaller child [OK]
Common Mistakes:
  • Not replacing root with last element
  • Swapping with larger child
  • Forgetting to bubble down fully
4. Identify the error in this bubble down pseudocode for a min-heap extraction:
function bubbleDown(heap, index):
  left = 2 * index + 1
  right = 2 * index + 2
  smallest = index
  if left < heap.size and heap[left] > heap[smallest]:
    smallest = left
  if right < heap.size and heap[right] > heap[smallest]:
    smallest = right
  if smallest != index:
    swap(heap[index], heap[smallest])
    bubbleDown(heap, smallest)
medium
A. The recursive call should be outside the if condition
B. The indices for left and right children are incorrect
C. The swap should happen only if smallest equals index
D. The comparisons should use '<' instead of '>' to find the smallest child

Solution

  1. Step 1: Check comparison logic

    In a min-heap, bubble down swaps with the smaller child, so comparisons must find the smallest value.
  2. Step 2: Identify incorrect operator

    The code uses '>' which finds the largest child; it should use '<' to find the smallest child.
  3. Final Answer:

    The comparisons should use '<' instead of '>' to find the smallest child -> Option D
  4. Quick Check:

    Use < to find smallest child in min-heap bubble down = A [OK]
Hint: Use '<' to find smaller child in min-heap bubble down [OK]
Common Mistakes:
  • Using '>' instead of '<' in comparisons
  • Mixing up left/right child indices
  • Calling bubbleDown outside swap condition
5. You have a max-heap represented as [50, 30, 40, 10, 20, 35]. After extracting the root and performing bubble down, what is the resulting array?
hard
A. [40, 30, 35, 10, 20]
B. [40, 30, 20, 10, 35]
C. [40, 35, 30, 10, 20]
D. [35, 30, 40, 10, 20]

Solution

  1. Step 1: Remove root and replace with last element

    Remove 50, replace root with 35: [35, 30, 40, 10, 20]
  2. Step 2: Bubble down to restore max-heap

    Compare 35 with children 30 and 40; swap with larger child 40: [40, 30, 35, 10, 20]
  3. Step 3: Continue bubbling down

    Now 35 at index 2 has children indices 5 and 6 which don't exist, so stop.
  4. Final Answer:

    [40, 30, 35, 10, 20] -> Option A
  5. Quick Check:

    Bubble down swaps with larger child in max-heap = C [OK]
Hint: Swap root with last, bubble down with larger child in max-heap [OK]
Common Mistakes:
  • Swapping with smaller child in max-heap
  • Not replacing root with last element
  • Stopping bubble down too early