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
" , 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
" ,
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 , "
" ;
}
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 <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
" , 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 . "
" ;
}
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.
leave a comment
0 Comments