What if you could instantly know the middle value of a never-ending list without sorting it all over and over?
Why Median of Data Stream Using Two Heaps in DSA C++?
Imagine you are tracking the middle value of a long list of numbers that keep coming in one by one, like scores in a game or temperatures throughout the day.
You try to write down all numbers and sort them every time a new number arrives to find the middle one.
Sorting the entire list every time a new number arrives is very slow and tiring, especially if the list grows very large.
It also wastes a lot of time and effort, making it hard to get the middle value quickly.
Using two heaps (special trees that keep numbers in order), one to keep the smaller half and one for the larger half, lets you quickly find the middle number without sorting everything again.
This way, you only adjust a few numbers each time, making the process fast and easy.
vector<int> numbers;
// On new number:
numbers.push_back(new_number);
sort(numbers.begin(), numbers.end());
int median = numbers[numbers.size() / 2];priority_queue<int> maxHeap; // smaller half priority_queue<int, vector<int>, greater<int>> minHeap; // larger half // On new number: if (maxHeap.empty() || new_number <= maxHeap.top()) maxHeap.push(new_number); else minHeap.push(new_number); // Balance heaps if (maxHeap.size() > minHeap.size() + 1) { minHeap.push(maxHeap.top()); maxHeap.pop(); } else if (minHeap.size() > maxHeap.size()) { maxHeap.push(minHeap.top()); minHeap.pop(); } // Median is top of maxHeap or average of tops
This method makes it possible to find the middle value instantly as new numbers keep coming in, no matter how many numbers there are.
Streaming services use this to show the median rating of a movie as users keep rating it live, without waiting for all ratings to finish.
Manually sorting every time is slow and inefficient.
Two heaps keep track of smaller and larger halves efficiently.
Median can be found quickly as data streams in.
Practice
Solution
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.Step 2: Explain how median is found
Balancing these heaps allows quick access to the middle values, enabling efficient median calculation.Final Answer:
To efficiently find the median by balancing smaller and larger halves of the data -> Option AQuick Check:
Two heaps balance halves = median found fast [OK]
- Thinking heaps sort entire data
- Using one heap only
- Confusing heaps with arrays
priority_queue?Solution
Step 1: Recall default priority_queue behavior
By default,priority_queuein C++ is a max-heap usingless<int>.Step 2: Identify correct declaration
Declaringpriority_queue<int> maxHeap;creates a max-heap without extra parameters.Final Answer:
priority_queue<int> maxHeap; -> Option BQuick Check:
Default priority_queue = max-heap [OK]
- Using greater<int> for max-heap
- Omitting vector container
- Confusing max-heap with min-heap syntax
priority_queue<int> maxHeap;
priority_queue minHeap;
// Insert 10
maxHeap.push(10);
// Insert 20
minHeap.push(20);
// Insert 15
if (15 <= maxHeap.top()) maxHeap.push(15); else minHeap.push(15);
// Balance heaps
if (maxHeap.size() > minHeap.size() + 1) {
minHeap.push(maxHeap.top());
maxHeap.pop();
} else if (minHeap.size() > maxHeap.size()) {
maxHeap.push(minHeap.top());
minHeap.pop();
}
// Calculate median
if (maxHeap.size() == minHeap.size())
cout << (maxHeap.top() + minHeap.top()) / 2.0 << endl;
else
cout << maxHeap.top() << endl;What is the output of this code?Solution
Step 1: Insert elements and balance heaps
Insert 10 into maxHeap: maxHeap = [10]. Insert 20 into minHeap: minHeap = [20]. Insert 15: 15 > 10, so goes to minHeap: minHeap = [15, 20]. Balance heaps: minHeap size (2) > maxHeap size (1), so move minHeap top (15) to maxHeap. Now maxHeap = [15, 10], minHeap = [20].Step 2: Calculate median
maxHeap size = 2, minHeap size = 1, so median is maxHeap.top() = 15. Sizes unequal, cout << maxHeap.top() << endl; outputs 15.Final Answer:
15 -> Option AQuick Check:
Median after balancing = 15 [OK]
- Not balancing heaps correctly
- Integer division instead of float
- Wrong heap insertion condition
priority_queue<int> maxHeap;
priority_queue minHeap;
void addNumber(int num) {
if (maxHeap.empty() || num <= maxHeap.top()) {
maxHeap.push(num);
} else {
minHeap.push(num);
}
if (maxHeap.size() > minHeap.size()) {
minHeap.push(maxHeap.top());
maxHeap.pop();
} else if (minHeap.size() > maxHeap.size() + 1) {
maxHeap.push(minHeap.top());
minHeap.pop();
}
}Solution
Step 1: Analyze balancing conditions
The code moves element from maxHeap to minHeap if maxHeap.size() > minHeap.size(), but it should only do so if maxHeap.size() > minHeap.size() + 1 to keep heaps balanced properly.Step 2: Confirm correct balancing logic
Proper balancing ensures size difference is at most 1. The current condition causes unnecessary moves, breaking balance.Final Answer:
The balancing condition for maxHeap is incorrect; it should check if maxHeap.size() > minHeap.size() + 1 -> Option CQuick Check:
Balance heaps only if size difference > 1 [OK]
- Wrong balancing condition
- Swapping heap roles
- Incorrect comparison operators
Solution
Step 1: Insert elements and balance heaps step-by-step
After processing the entire stream with proper insertion (to maxHeap if <= max.top or empty, else minHeap) and balancing (rebalance if max.size > min.size + 1 or min.size > max.size), final state: maxHeap size=5 (top=7), minHeap size=5 (top=8).Step 2: Calculate final median
After all insertions, maxHeap size = 5, minHeap size = 5, median = average of tops: (7 + 8) / 2 = 7.5Final Answer:
7.5 -> Option DQuick Check:
Median after all insertions = 7.5 [OK]
- Not balancing heaps after each insertion
- Calculating median from wrong heap
- Forgetting to average when heaps equal size
Ready to prove it?
Pass the test and this pattern moves unknown
