Bird
Raised Fist0
DSA Javascriptprogramming~10 mins

Median of Data Stream Using Two Heaps in DSA Javascript - Execution Trace

Choose your learning style10 modes available
Concept Flow - Median of Data Stream Using Two Heaps
New number arrives
↓
Compare with maxHeap top?
↓
Add to maxHeap
↓
Balance heaps size?
↓
If size difference > 1
↓
Move root from bigger heap to smaller heap
↓
Calculate median
↓
Return median
New numbers go into one of two heaps (maxHeap for smaller half, minHeap for larger half). We keep heaps balanced, then median is top(s) of heaps.
Execution Sample
DSA Javascript
class MedianFinder {
  constructor() {
    this.maxHeap = new MaxHeap();
    this.minHeap = new MinHeap();
  }
  addNum(num) {
    // add number logic
  }
  findMedian() {
    // median logic
  }
}
This class adds numbers to two heaps and finds median efficiently.
Execution Table
StepOperationNumber AddedMaxHeap NodesMinHeap NodesBalance ActionMedian CalculationVisual State
1Add number5[5][]No balance neededMedian = 5MaxHeap: [5], MinHeap: []
2Add number2[5, 2][]Balance: Move 5 to MinHeapMedian = (2 + 5)/2 = 3.5MaxHeap: [2], MinHeap: [5]
3Add number10[2][5, 10]Balance: Move 5 to MaxHeapMedian = 5MaxHeap: [5, 2], MinHeap: [10]
4Add number1[5, 2, 1][10]No balance neededMedian = (2 + 5)/2 = 3.5MaxHeap: [5, 2, 1], MinHeap: [10]
5Add number3[5, 3, 1, 2][10]Balance: Move 5 to MinHeapMedian = 3MaxHeap: [3, 2, 1], MinHeap: [5, 10]
6Add number8[3, 2, 1][5, 10, 8]Balance: Move 5 to MaxHeapMedian = 5MaxHeap: [5, 3, 1, 2], MinHeap: [8, 10]
7Add number7[5, 3, 1, 2][7, 8, 10]Balance: Move 7 to MaxHeapMedian = (5 + 7)/2 = 6MaxHeap: [7, 5, 1, 2, 3], MinHeap: [8, 10]
8Add number6[7, 6, 1, 2, 3, 5][8, 10]No balance neededMedian = 6MaxHeap: [7, 6, 1, 2, 3, 5], MinHeap: [8, 10]
9Add number4[7, 6, 4, 2, 3, 5, 1][8, 10]Balance: Move 7 to MinHeapMedian = (6 + 7)/2 = 6.5MaxHeap: [6, 5, 4, 2, 3, 1], MinHeap: [7, 8, 10]
10Add number9[6, 5, 4, 2, 3, 1][7, 8, 10, 9]Balance: Move 7 to MaxHeapMedian = 7MaxHeap: [7, 6, 4, 2, 3, 1, 5], MinHeap: [8, 9, 10]
11Stop-[7, 6, 4, 2, 3, 1, 5][8, 9, 10]Heaps balancedMedian = 7Final state
💡 All numbers added and heaps balanced; median calculated at each step.
Variable Tracker
VariableStartAfter 1After 2After 3After 4After 5After 6After 7After 8After 9After 10Final
maxHeap[][5][2][2][5,2,1][3,2,1][3,2,1][7,5,1,2,3][7,6,1,2,3,5][6,5,4,2,3,1][7,6,4,2,3,1,5][7,6,4,2,3,1,5]
minHeap[][][5][5,10][10][10][8,10][8,10][7,8,10][8,9,10][8,9,10][8,9,10]
medianN/A53.553.535666.577
Key Moments - 3 Insights
Why do we move elements between heaps after adding a number?
Because heaps must be balanced in size (difference at most 1) to correctly find the median. See execution_table rows 2, 3, 5, 6 where balance actions move elements.
Why do we add smaller numbers to maxHeap and larger to minHeap?
MaxHeap stores the smaller half so its top is the largest of the smaller numbers; MinHeap stores larger half so its top is smallest of larger numbers. This split helps find median quickly. See concept_flow and execution_table steps.
How is median calculated when heaps have equal size vs different sizes?
If heaps are equal size, median is average of both tops (rows 2,5,9). If one heap is bigger, median is top of that heap (rows 1,3,4,6,8,10).
Visual Quiz - 3 Questions
Test your understanding
Look at execution_table row 5, what is the median after adding number 3?
A4
B3
C5
D3.5
💡 Hint
Check the 'Median Calculation' column in row 5 of execution_table.
At which step does the maxHeap first contain 7 elements?
AStep 9
BStep 10
CStep 7
DStep 11
💡 Hint
Look at 'MaxHeap Nodes' column in execution_table rows for size changes.
If we add a number smaller than all existing numbers, which heap will it go to initially?
AminHeap
BEither heap randomly
CmaxHeap
DNeither heap
💡 Hint
Refer to concept_flow: smaller numbers go to maxHeap.
Concept Snapshot
Median of Data Stream Using Two Heaps:
- Use maxHeap for smaller half, minHeap for larger half
- Add new number to correct heap based on comparison
- Balance heaps sizes (difference ≤ 1)
- Median is top of bigger heap or average of both tops
- Efficient for streaming data median calculation
Full Transcript
This concept uses two heaps to find the median of a stream of numbers efficiently. New numbers are added to either a maxHeap (holding smaller half) or a minHeap (holding larger half). After each addition, heaps are balanced so their sizes differ by at most one. The median is then either the top of the bigger heap or the average of both tops if sizes are equal. The execution table shows step-by-step how numbers are added, heaps balanced, and median calculated. The variable tracker records heap contents and median after each step. Key moments clarify why balancing is needed, how numbers are assigned to heaps, and how median is computed. The visual quiz tests understanding of median values and heap sizes at specific steps.

Practice

(1/5)
1. What is the main purpose of using two heaps (a max-heap and a min-heap) when finding the median of a data stream?
easy
A. To sort all numbers in ascending order
B. To efficiently keep track of the lower half and upper half of the numbers separately
C. To store all numbers in a single data structure
D. To find the maximum number in the data stream

Solution

  1. Step 1: Understand the role of two heaps

    The max-heap stores the smaller half of the numbers, and the min-heap stores the larger half.
  2. Step 2: Explain how this helps find the median

    By balancing these heaps, the median is either the top of one heap or the average of the tops of both heaps.
  3. Final Answer:

    To efficiently keep track of the lower half and upper half of the numbers separately -> Option B
  4. Quick Check:

    Two heaps split data halves = A [OK]
Hint: Two heaps split data halves for median [OK]
Common Mistakes:
  • Thinking heaps sort all numbers fully
  • Using only one heap for median
  • Confusing max-heap and min-heap roles
2. Which of the following is the correct way to insert a number into the two heaps when maintaining the median in JavaScript?
easy
A. Always insert into min-heap
B. Always insert into max-heap
C. Insert into max-heap if number is less than or equal to max-heap root; else insert into min-heap
D. Insert randomly into either heap

Solution

  1. Step 1: Decide heap based on number value

    If the number is smaller or equal to the max-heap root, it belongs to the lower half, so insert into max-heap.
  2. Step 2: Otherwise insert into min-heap

    If the number is greater, it belongs to the upper half, so insert into min-heap.
  3. Final Answer:

    Insert into max-heap if number is less than or equal to max-heap root; else insert into min-heap -> Option C
  4. Quick Check:

    Compare with max-heap root to choose heap [OK]
Hint: Compare with max-heap root to choose heap [OK]
Common Mistakes:
  • Inserting all numbers into one heap
  • Not comparing with max-heap root
  • Inserting randomly without condition
3. Consider the following JavaScript code snippet using two heaps to find the median after inserting numbers 5, 15, 1, 3:
const maxHeap = new MaxHeap();
const minHeap = new MinHeap();

function addNum(num) {
  if (maxHeap.size() === 0 || num <= maxHeap.peek()) {
    maxHeap.insert(num);
  } else {
    minHeap.insert(num);
  }

  if (maxHeap.size() > minHeap.size() + 1) {
    minHeap.insert(maxHeap.extract());
  } else if (minHeap.size() > maxHeap.size()) {
    maxHeap.insert(minHeap.extract());
  }
}

addNum(5);
addNum(15);
addNum(1);
addNum(3);

const median = maxHeap.size() > minHeap.size() ? maxHeap.peek() : (maxHeap.peek() + minHeap.peek()) / 2;
console.log(median);
What is the output printed?
medium
A. 4
B. 3
C. 5
D. 6

Solution

  1. Step 1: Insert numbers and balance heaps

    Insert 5 into maxHeap (empty). Insert 15 into minHeap (15 > 5). Insert 1 into maxHeap (1 <= 5). Insert 3 into maxHeap (3 <= 5). Now maxHeap has 3 elements, minHeap has 1.
  2. Step 2: Balance heaps sizes

    maxHeap size (3) > minHeap size (1) + 1, so move maxHeap.extract() (which is 5) to minHeap. Now maxHeap has [3,1], minHeap has [5,15]. Median is average of maxHeap.peek()=3 and minHeap.peek()=5, so (3+5)/2 = 4.
  3. Final Answer:

    4 -> Option A
  4. Quick Check:

    Median after balancing = 4 [OK]
Hint: Balance heaps sizes, median is middle or average [OK]
Common Mistakes:
  • Not balancing heaps after insertion
  • Taking median as maxHeap.peek() only
  • Incorrect heap extraction order
4. The following code snippet is intended to maintain the median using two heaps, but it has a bug:
function addNum(num) {
  if (num < maxHeap.peek()) {
    maxHeap.insert(num);
  } else {
    minHeap.insert(num);
  }

  if (maxHeap.size() > minHeap.size() + 1) {
    minHeap.insert(maxHeap.extract());
  } else if (minHeap.size() > maxHeap.size()) {
    maxHeap.insert(minHeap.extract());
  }
}
What is the bug in this code?
medium
A. It inserts all numbers into minHeap
B. It uses > instead of >= in the size comparison
C. It balances heaps incorrectly by moving elements the wrong way
D. It does not handle the case when maxHeap is empty before peek()

Solution

  1. Step 1: Identify peek() usage problem

    The code calls maxHeap.peek() without checking if maxHeap is empty, causing an error on first insertion.
  2. Step 2: Explain impact of missing empty check

    Without checking, calling peek() on empty maxHeap throws an error, so the first number cannot be inserted properly.
  3. Final Answer:

    It does not handle the case when maxHeap is empty before peek() -> Option D
  4. Quick Check:

    Empty maxHeap peek() causes error [OK]
Hint: Check heap empty before peek() to avoid errors [OK]
Common Mistakes:
  • Ignoring empty heap before peek()
  • Assuming heaps always balanced before insert
  • Incorrect size comparison operators
5. You are given a stream of numbers: [2, 4, 7, 1, 5, 3]. Using two heaps (max-heap for lower half, min-heap for upper half), what is the median after inserting all numbers? Also, explain why balancing the heaps is important in this process.
hard
A. 3.5; Balancing keeps heaps sizes equal or off by one to find median correctly
B. 4; Balancing is not necessary if we always insert correctly
C. 3; Balancing helps to sort the entire stream
D. 5; Balancing is used to find max value quickly

Solution

  1. Step 1: Insert numbers and balance heaps

    Insert 2 (maxHeap empty, goes to maxHeap). Insert 4 (4 > 2, minHeap). Insert 7 (7 > 2, minHeap). Now minHeap has 2 elements, maxHeap 1, so move minHeap.extract() (4) to maxHeap. Insert 1 (1 <= 4, maxHeap). Insert 5 (5 > 4, minHeap). Insert 3 (3 <= 4, maxHeap). Heaps are balanced with maxHeap size 4 and minHeap size 2, move maxHeap.extract() (4) to minHeap to balance sizes.
  2. Step 2: Calculate median and explain balancing

    Now maxHeap has [3,2,1] with peek()=3, minHeap has [4,5,7] with peek()=4. Since sizes equal (3 and 3), median is (3 + 4)/2 = 3.5. Balancing keeps heaps sizes equal or off by one to find median correctly from the tops.
  3. Final Answer:

    3.5; Balancing keeps heaps sizes equal or off by one to find median correctly -> Option A
  4. Quick Check:

    Balanced heaps give median 3.5 [OK]
Hint: Balance heaps sizes to get median from tops [OK]
Common Mistakes:
  • Not balancing heaps after each insertion
  • Calculating median from unsorted data
  • Confusing median with max or min values
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard