Skip to content
Related Articles

Related Articles

Average of a stream of numbers

View Discussion
Improve Article
Save Article
  • Difficulty Level : Easy
  • Last Updated : 17 Jun, 2022
View Discussion
Improve Article
Save Article

Difficulty Level: Rookie

Given a stream of numbers, print the 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
  ..................
Recommended Practice

To print the mean of a stream, we need to find out how to find the average when a new number is being added to the stream. To do this, all we need is the 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).

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 

Time Complexity: O(n)

Auxiliary Space: O(1)

The above function getAvg() can be optimized using the following changes. We can avoid the use of prev_avg and the number of elements by using static variables (Assuming that only this function is called for an average of stream). Following is the optimized version. 

C++




#include <bits/stdc++.h>
using namespace std;
 
// Returns the new average after including x
float getAvg(int x)
{
    static int sum, n;
 
    sum += x;
    return (((float)sum) / ++n);
}
 
// Prints average of a stream of numbers
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;
}
 
// Driver code
int main()
{
    float arr[] = { 10, 20, 30, 40, 50, 60 };
    int n = sizeof(arr) / sizeof(arr[0]);
    streamAvg(arr, n);
 
    return 0;
}
 
// This code is contributed by rathbhupendra

C




#include <stdio.h>
 
// Returns the new average after including x
float getAvg(int x)
{
    static int sum, n;
 
    sum += x;
    return (((float)sum) / ++n);
}
 
// Prints average of a stream of numbers
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;
}
 
// Driver program to test above functions
int main()
{
    float arr[] = { 10, 20, 30, 40, 50, 60 };
    int n = sizeof(arr) / sizeof(arr[0]);
    streamAvg(arr, n);
 
    return 0;
}

Java




// Java program to return
// Average of a stream of numbers
class GFG
{
static int sum, n;
     
// Returns the new average
// after including x
static float getAvg(int x)
{
    sum += x;
    return (((float)sum) / ++n);
}
 
// Prints average of a
// stream of numbers
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;
}
 
// Driver Code
public static void main(String[] args)
{
    float[] arr = new float[]{ 10, 20, 30,
                               40, 50, 60 };
    int n = arr.length;
    streamAvg(arr, n);
}
}
 
// This code is contributed by mits

Python3




# Returns the new average
# after including x
def getAvg(x, n, sum):
    sum = sum + x;
    return float(sum) / n;
 
# Prints average of a
# stream of numbers
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;
 
# Driver Code
arr= [ 10, 20, 30,
       40, 50, 60 ];
n = len(arr);
streamAvg(arr,n);
 
# This code is contributed by mits

C#




using System;
 
class GFG
{
static int sum, n;
     
// Returns the new average
// after including x
static float getAvg(int x)
{
 
    sum += x;
    return (((float)sum) / ++n);
}
 
// Prints average of a
// stream of numbers
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;
}
 
// Driver Code
static int Main()
{
    float[] arr = new float[]{ 10, 20, 30,
                               40, 50, 60 };
    int n = arr.Length;
    streamAvg(arr, n);
 
    return 0;
}
}
 
// This code is contributed by mits

PHP




<?php
// Returns the new average
// after including x
function getAvg($x)
{
    static $sum;
    static $n;
    $sum += $x;
    return (((float)$sum) / ++$n);
}
 
// Prints average of
// a stream of numbers
function streamAvg($arr, $n)
{
    for ($i = 0; $i < $n; $i++)
    {
        $avg = getAvg($arr[$i]);
        echo "Average of " . ($i + 1) .
             " numbers is ".$avg." \n";
    }
    return;
}
 
// Driver Code
$arr = array(10, 20, 30,
             40, 50, 60);
$n = sizeof($arr) / sizeof($arr[0]);
streamAvg($arr, $n);
 
// This code is contributed by mits
?>

Javascript




<script>
// javascript program to return
// Average of a stream of numbers
 
    var sum=0, n=0;
 
    // Returns the new average
    // after including x
    function getAvg(x) {
        sum += x;
        n++;
        return (sum / n);
    }
 
    // Prints average of a
    // stream of numbers
    function streamAvg( arr , m) {
        var avg = 0;
        for (i = 0; i < m; i++) {
            avg = getAvg(parseInt(arr[i]));
            document.write("Average of " + (i + 1) + " numbers is " + avg.toFixed(1)+"<br/>");
        }
        return;
    }
 
    // Driver Code
     
        var arr =  [ 10, 20, 30, 40, 50, 60 ];
        var m = arr.length;
        streamAvg(arr, m);
 
// This code is contributed by todaysgaurav
</script>

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

Time Complexity: O(n)

Auxiliary Space: O(1)

Thanks to Abhijeet Deshpande for suggesting this optimized version. 

Related article: 
Program for an 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.


My Personal Notes arrow_drop_up
Recommended Articles
Page :

Start Your Coding Journey Now!