Difficulty Level: Rookie
Given a stream of numbers, print average (or mean) of the stream at every point. For example, let us consider the stream as 10, 20, 30, 40, 50, 60, …
Average of 1 numbers is 10.00
Average of 2 numbers is 15.00
Average of 3 numbers is 20.00
Average of 4 numbers is 25.00
Average of 5 numbers is 30.00
Average of 6 numbers is 35.00
..................
To print mean of a stream, we need to find out how to find average when a new number is being added to the stream. To do this, all we need is count of numbers seen so far in the stream, previous average and new number. Let n be the count, prev_avg be the previous average and x be the new number being added. The average after including x number can be written as (prev_avg*n + x)/(n+1).
C++
#include <stdio.h>
float getAvg( float prev_avg, int x, int n)
{
return (prev_avg * n + x) / (n + 1);
}
void streamAvg( float arr[], int n)
{
float avg = 0;
for ( int i = 0; i < n; i++) {
avg = getAvg(avg, arr[i], i);
printf ( "Average of %d numbers is %f \n" , i + 1, avg);
}
return ;
}
int main()
{
float arr[] = { 10, 20, 30, 40, 50, 60 };
int n = sizeof (arr) / sizeof (arr[0]);
streamAvg(arr, n);
return 0;
}
|
Java
class GFG {
static float getAvg( float prev_avg, float x, int n)
{
return (prev_avg * n + x) / (n + 1 );
}
static void streamAvg( float arr[], int n)
{
float avg = 0 ;
for ( int i = 0 ; i < n; i++)
{
avg = getAvg(avg, arr[i], i);
System.out.printf( "Average of %d numbers is %f \n" ,
i + 1 , avg);
}
return ;
}
public static void main(String[] args)
{
float arr[] = { 10 , 20 , 30 , 40 , 50 , 60 };
int n = arr.length;
streamAvg(arr, n);
}
}
|
Python3
def getAvg(prev_avg, x, n):
return ((prev_avg *
n + x) /
(n + 1 ));
def streamAvg(arr, n):
avg = 0 ;
for i in range (n):
avg = getAvg(avg, arr[i], i);
print ( "Average of " , i + 1 ,
" numbers is " , avg);
arr = [ 10 , 20 , 30 ,
40 , 50 , 60 ];
n = len (arr);
streamAvg(arr, n);
|
C#
using System;
class GFG
{
static float getAvg( float prev_avg,
float x, int n)
{
return (prev_avg * n + x) / (n + 1);
}
static void streamAvg( float [] arr,
int n)
{
float avg = 0;
for ( int i = 0; i < n; i++)
{
avg = getAvg(avg, arr[i], i);
Console.WriteLine( "Average of {0} " +
"numbers is {1}" ,
i + 1, avg);
}
return ;
}
public static void Main(String[] args)
{
float [] arr = {10, 20, 30,
40, 50, 60};
int n = arr.Length;
streamAvg(arr, n);
}
}
|
PHP
<?php
function getAvg( $prev_avg , $x , $n )
{
return ( $prev_avg * $n + $x ) /
( $n + 1);
}
function streamAvg( $arr , $n )
{
$avg = 0;
for ( $i = 0; $i < $n ; $i ++)
{
$avg = getAvg( $avg , $arr [ $i ], $i );
echo "Average of " , $i + 1, "numbers is "
, $avg , "\n" ;
}
return ;
}
$arr = array (10, 20, 30, 40, 50, 60);
$n = sizeof( $arr );
streamAvg( $arr , $n );
?>
|
Output :
Average of 1 numbers is 10.000000
Average of 2 numbers is 15.000000
Average of 3 numbers is 20.000000
Average of 4 numbers is 25.000000
Average of 5 numbers is 30.000000
Average of 6 numbers is 35.000000
The above function getAvg() can be optimized using following changes. We can avoid the use of prev_avg and number of elements by using static variables (Assuming that only this function is called for average of stream). Following is the oprimnized version.
C++
#include <bits/stdc++.h>
using namespace std;
float getAvg( int x)
{
static int sum, n;
sum += x;
return ((( float )sum) / ++n);
}
void streamAvg( float arr[], int n)
{
float avg = 0;
for ( int i = 0; i < n; i++)
{
avg = getAvg(arr[i]);
cout<< "Average of " <<i+1<< " numbers is " <<fixed<<setprecision(1)<<avg<<endl;
}
return ;
}
int main()
{
float arr[] = { 10, 20, 30, 40, 50, 60 };
int n = sizeof (arr) / sizeof (arr[0]);
streamAvg(arr, n);
return 0;
}
|
C
#include <stdio.h>
float getAvg( int x)
{
static int sum, n;
sum += x;
return ((( float )sum) / ++n);
}
void streamAvg( float arr[], int n)
{
float avg = 0;
for ( int i = 0; i < n; i++) {
avg = getAvg(arr[i]);
printf ( "Average of %d numbers is %f \n" , i + 1, avg);
}
return ;
}
int main()
{
float arr[] = { 10, 20, 30, 40, 50, 60 };
int n = sizeof (arr) / sizeof (arr[0]);
streamAvg(arr, n);
return 0;
}
|
Java
class GFG
{
static int sum, n;
static float getAvg( int x)
{
sum += x;
return ((( float )sum) / ++n);
}
static void streamAvg( float [] arr,
int n)
{
float avg = 0 ;
for ( int i = 0 ; i < n; i++)
{
avg = getAvg(( int )arr[i]);
System.out.println( "Average of " + (i + 1 ) +
" numbers is " + avg);
}
return ;
}
public static void main(String[] args)
{
float [] arr = new float []{ 10 , 20 , 30 ,
40 , 50 , 60 };
int n = arr.length;
streamAvg(arr, n);
}
}
|
Python3
def getAvg(x, n, sum ):
sum = sum + x;
return float ( sum ) / n;
def streamAvg(arr, n):
avg = 0 ;
sum = 0 ;
for i in range (n):
avg = getAvg(arr[i], i + 1 , sum );
sum = avg * (i + 1 );
print ( "Average of " , end = "");
print (i + 1 , end = "");
print ( " numbers is " , end = "");
print (avg);
return ;
arr = [ 10 , 20 , 30 ,
40 , 50 , 60 ];
n = len (arr);
streamAvg(arr,n);
|
C#
using System;
class GFG
{
static int sum, n;
static float getAvg( int x)
{
sum += x;
return ((( float )sum) / ++n);
}
static void streamAvg( float [] arr, int n)
{
float avg = 0;
for ( int i = 0; i < n; i++)
{
avg = getAvg(( int )arr[i]);
Console.WriteLine( "Average of {0} numbers " +
"is {1}" , (i + 1), avg);
}
return ;
}
static int Main()
{
float [] arr = new float []{ 10, 20, 30,
40, 50, 60 };
int n = arr.Length;
streamAvg(arr, n);
return 0;
}
}
|
PHP
<?php
function getAvg( $x )
{
static $sum ;
static $n ;
$sum += $x ;
return (((float) $sum ) / ++ $n );
}
function streamAvg( $arr , $n )
{
for ( $i = 0; $i < $n ; $i ++)
{
$avg = getAvg( $arr [ $i ]);
echo "Average of " . ( $i + 1) .
" numbers is " . $avg . " \n" ;
}
return ;
}
$arr = array (10, 20, 30,
40, 50, 60);
$n = sizeof( $arr ) / sizeof( $arr [0]);
streamAvg( $arr , $n );
?>
|
Output:
Average of 1 numbers is 10.0
Average of 2 numbers is 15.0
Average of 3 numbers is 20.0
Average of 4 numbers is 25.0
Average of 5 numbers is 30.0
Average of 6 numbers is 35.0
Thanks to Abhijeet Deshpande for suggesting this optimized version.
Related article:
Program for average of an array (Iterative and Recursive)
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
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.