Update average value of a continuous sequence of numbers in constant time

How can you add and subtract numbers on average without going through the whole list?

This can be very useful in many situations. For example, to continuously calculate the average of the last X values ​​in a stream, adding two average values ​​together and updating the rating based on a new user’s vote.

+4
source share
2 answers

Indeed, it is possible to control single values ​​on average over a constant time, O (1).

. average - , size - , value - , :

double addToAverage(double average, int size, double value)
{
    return (size * average + value) / (size + 1);
}

, :

double subtractFromAverage(double average, int size, double value)
{
    return (size * average - value) / (size - 1);
}

, . , X /.

double replaceInAverage(double average, int size, double oldValue, double newValue)
{
    return (size * average - oldvalue + newValue) / size;
}

:

double addAveragesTogether(double averageA, int sizeA, double averageB, int sizeB)
{
    return (sizeA * averageA + sizeB * averageB) / (sizeA + sizeB);
}
+17

, , - :

( n * a + v ) / n + 1;

n - , a , v - .

, n * a , n , . a :

a + ( v - a ) / n

n - , , . a , , , .

0

Source: https://habr.com/ru/post/1536004/


All Articles