# 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 from the data stream, the median is 5.
After reading arr from the data stream, the median is 7.5.
After reading arr 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); ` ` `  `    ``// Function call ` `    ``findMedian(arr, N); ` `} `

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

My Personal Notes arrow_drop_up
Recommended Articles
Page :