What if you could instantly know the middle value of a never-ending list without sorting it every time?
Why Median of Data Stream Using Two Heaps in DSA C#?
Imagine you are tracking the middle value of a list of numbers that keeps growing, like recording the median temperature every hour. Doing this by hand means sorting the entire list every time a new number arrives.
Sorting the whole list after each new number is slow and tiring. It wastes time and can cause mistakes, especially if the list is very long or updates happen often.
Using two heaps (one max heap and one min heap) lets us quickly find the middle value without sorting everything. One heap keeps the smaller half, the other keeps the bigger half, so the median is always easy to find.
List<int> numbers = new List<int>(); numbers.Add(newNumber); numbers.Sort(); int median = numbers[(numbers.Count - 1) / 2];
MaxHeap smallerHalf = new MaxHeap(); MinHeap largerHalf = new MinHeap(); AddNumber(newNumber); int median = GetMedian();
This method makes it possible to find the median instantly even as new numbers keep coming in, perfect for live data streams.
Streaming apps use this to show the middle rating of songs as users keep rating them, updating the median rating live without delay.
Manual sorting after each new number is slow and inefficient.
Two heaps keep track of smaller and larger halves for quick median access.
This approach handles continuous data streams smoothly and fast.
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: How this helps find the median
By balancing these heaps, the median is either the top of one heap or the average of both tops.Final Answer:
To efficiently find the median by balancing smaller and larger halves of the data -> Option DQuick Check:
Two heaps balance halves = median found efficiently [OK]
- Thinking heaps sort all data fully
- Using only one heap for median
- Confusing median with mean
Solution
Step 1: Understand PriorityQueue default behavior
By default, PriorityQueue in C# is a min-heap based on priority values.Step 2: Creating a max-heap requires reversing comparison
Using Comparer<int>.Create((a, b) => b - a) reverses order to make a max-heap.Final Answer:
var maxHeap = new PriorityQueue<int, int>(Comparer<int>.Create((a, b) => b - a)); -> Option BQuick Check:
Reverse comparer creates max-heap [OK]
- Using default comparer creates min-heap, not max-heap
- Confusing type parameters in PriorityQueue
- Not providing comparer for max-heap
Solution
Step 1: Insert numbers and balance heaps
Insert 5 -> maxHeap=[5]; 15 -> minHeap=[15]; 1 ≤ max.top(5) -> maxHeap=[5,1] top=5; 3 ≤5 -> maxHeap=[5,1,3] top=5 (size 3 vs 1). Balance: move max.top=5 to minHeap -> maxHeap=[3,1] top=3, minHeap=[15,5] top=5.Step 2: Calculate median from heaps
maxHeap top = 3, minHeap top = 5. Median = (3 + 5) / 2 = 4.Final Answer:
4 -> Option AQuick Check:
Median of [1,3,5,15] = 4 [OK]
- Not balancing heaps after each insertion
- Taking median as middle element without averaging
- Mixing up maxHeap and minHeap tops
if (maxHeap.Count == 0 || num <= maxHeap.Peek())
maxHeap.Enqueue(num, num);
else
minHeap.Enqueue(num, num);
// Balance heaps
if (maxHeap.Count > minHeap.Count + 1)
minHeap.Enqueue(maxHeap.Dequeue(), maxHeap.Dequeue());
else if (minHeap.Count > maxHeap.Count)
maxHeap.Enqueue(minHeap.Dequeue(), minHeap.Dequeue());Solution
Step 1: Analyze balancing code
When balancing, code calls Dequeue() twice to move one element, which removes two elements incorrectly.Step 2: Correct balancing approach
Only one Dequeue() should be called to move one element from one heap to the other.Final Answer:
Calling Dequeue() twice when balancing heaps causes errors -> Option CQuick Check:
Double Dequeue removes two elements instead of one [OK]
- Calling Dequeue twice instead of once
- Ignoring heap size difference rules
- Incorrect comparison operators for insertion
Solution
Step 1: Understand handling of duplicates in heaps
Duplicates are stored like any other number; heaps do not remove duplicates automatically.Step 2: Insert numbers and find median
Numbers: [2, 2, 3, 4, 4, 4]. Sorted: [2, 2, 3, 4, 4, 4]. Median is average of 3rd and 4th elements: (3 + 4) / 2 = 3.5.Final Answer:
Duplicates are stored normally; median is 3.5 -> Option AQuick Check:
Duplicates stored; median of [2,2,3,4,4,4] = 3.5 [OK]
- Assuming duplicates are removed automatically
- Calculating median incorrectly with duplicates
- Confusing median with mode
Ready to prove it?
Pass the test and this pattern moves unknown
