Median of Stream of Running Integers using STL | Set 2
Last Updated :
17 Mar, 2023
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++
#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;
void findMedian( int arr[], int N)
{
idxmst mst;
for ( int i = 0; i < N; i++) {
mst.insert(arr[i]);
if (i % 2 != 0) {
double res
= *mst.find_by_order(i / 2);
double res1
= *mst.find_by_order(
(i + 1) / 2);
cout<< (res + res1) / 2.0<< " " ;
}
else {
double res
= *mst.find_by_order(i / 2);
cout << res << " " ;
}
}
}
int main()
{
int arr[] = { 1, 2, 3, 3, 4 };
int N = sizeof (arr) / sizeof (arr[0]);
findMedian(arr, N);
}
|
Python3
from collections import OrderedDict
def find_median(arr):
ordered_dict = OrderedDict()
for i in range ( len (arr)):
ordered_dict[arr[i]] = ordered_dict.get(arr[i], 0 ) + 1
if i % 2 ! = 0 :
mid = list (ordered_dict.keys())[i / / 2 :i / / 2 + 2 ]
median = (mid[ 0 ] + mid[ 1 ]) / 2
print ( "%.1f" % median, end = " " )
else :
mid = list (ordered_dict.keys())[i / / 2 ]
print (mid, end = " " )
arr = [ 1 , 2 , 3 , 3 , 4 ]
find_median(arr)
|
Javascript
let orderedObj = {};
function find_median(arr) {
for (let i = 0; i < arr.length; i++) {
orderedObj[arr[i]] = (orderedObj[arr[i]] || 0) + 1;
if (i % 2 !== 0) {
let mid = Object.keys(orderedObj).slice(i / 2, i / 2 + 2);
let median = (parseInt(mid[0]) + parseInt(mid[1])) / 2;
process.stdout.write(median.toFixed(1) + " " );
} else {
let mid = Object.keys(orderedObj)[i / 2];
process.stdout.write(mid + " " );
}
}
}
let arr = [1, 2, 3, 3, 4];
find_median(arr);
|
Java
import java.util.*;
public class GFG {
public static void findMedian( int [] arr) {
Map<Integer, Integer> ordered_dict = new TreeMap<>();
for ( int i = 0 ; i < arr.length; i++) {
ordered_dict.put(arr[i], ordered_dict.getOrDefault(arr[i], 0 ) + 1 );
if (i % 2 != 0 ) {
List<Integer> mid = new ArrayList<>(ordered_dict.keySet()).subList(i / 2 , i / 2 + 2 );
double median = (mid.get( 0 ) + mid.get( 1 )) / 2.0 ;
System.out.print(String.format( "%.1f" , median) + " " );
} else {
int mid = new ArrayList<>(ordered_dict.keySet()).get(i / 2 );
System.out.print(mid + " " );
}
}
}
public static void main(String[] args) {
int [] arr = { 1 , 2 , 3 , 3 , 4 };
findMedian(arr);
}
}
|
C#
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main( string [] args)
{
int [] arr = { 1, 2, 3, 3, 4 };
find_median(arr);
}
static void find_median( int [] arr)
{
Dictionary< int , int > ordered_dict = new Dictionary< int , int >();
for ( int i = 0; i < arr.Length; i++)
{
if (ordered_dict.ContainsKey(arr[i]))
{
ordered_dict[arr[i]]++;
}
else
{
ordered_dict[arr[i]] = 1;
}
if (i % 2 != 0)
{
var mid = ordered_dict.Keys.ToList().GetRange(i / 2, 2);
var median = (mid[0] + mid[1]) / 2.0;
Console.Write( "{0:F1} " , median);
}
else
{
var mid = ordered_dict.Keys.ToList().GetRange(i / 2, 1);
Console.Write( "{0} " , mid[0]);
}
}
}
}
|
Time Complexity: O(N * log(N))
Auxiliary Space: O(N)
Share your thoughts in the comments
Please Login to comment...