# 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

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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 ` `#include   ` `#include   ` `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)

My Personal Notes arrow_drop_up
Recommended Articles
Page :