Skip to content
Related Articles

Related Articles

Improve Article

Median of Stream of Running Integers using STL | Set 2

  • Difficulty Level : Hard
  • Last Updated : 08 Dec, 2020

Given an array arr[] of size N representing integers required to be read as a data stream, the task is to calculate and print the median after reading every integer.

Examples:

Input: arr[] = { 5, 10, 15 }
Output: 5 7.5 10
Explanation:
After reading arr[0] from the data stream, the median is 5.
After reading arr[1] from the data stream, the median is 7.5.
After reading arr[2] from the data stream, the median is 10.

Input: arr[] = { 1, 2, 3, 4 }
Output: 1 1.5 2 2.5

Approach: The problem can be solved using Ordered Set. Follow the steps below to solve the problem:



  • Initialize a multi Ordered Set say, mst to store the array elements in a sorted order.
  • Traverse the array using variable i. For every ith element insert arr[i] into mst and check if the variable i is even or not. If found to be true then print the median using (*mst.find_by_order(i / 2)).
  • Otherwise, print the median by taking the average of (*mst.find_by_order(i / 2)) and (*mst.find_by_order((i + 1) / 2)).

Below is the implementation of the above approach:

C++




// C++ program to implement
// the above approach
  
#include <iostream>
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 
using namespace __gnu_pbds; 
using namespace std;
typedef tree<int, null_type, 
less_equal<int>, rb_tree_tag,
tree_order_statistics_node_update> idxmst;
  
  
  
// Function to find the median
// of running integers
void findMedian(int arr[], int N)
{
    // Initialise a multi ordered set
    // to store the array elements 
    // in sorted order
    idxmst mst;
      
    // Traverse the array
    for (int i = 0; i < N; i++) {
  
        // Insert arr[i] into mst
        mst.insert(arr[i]);
  
        // If i is an odd number
        if (i % 2 != 0) {
  
            // Stores the first middle
            // element of mst
            double res 
             = *mst.find_by_order(i / 2);
  
            // Stores the second middle
            // element of mst
            double res1 
              = *mst.find_by_order(
                             (i + 1) / 2);
  
            cout<< (res + res1) / 2.0<<" ";
        }
        else {
  
            // Stores middle element of mst
            double res
               = *mst.find_by_order(i / 2);
  
            // Print median
            cout << res << " ";
        }
    }
}
  
// Driver Code
int main()
{
    // Given stream of integers
    int arr[] = { 1, 2, 3, 3, 4 };
  
    int N = sizeof(arr) / sizeof(arr[0]);
  
    // Function call
    findMedian(arr, N);
}

Time Complexity: O(N * log(N))
Auxiliary Space: O(N)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.




My Personal Notes arrow_drop_up
Recommended Articles
Page :