首页 > 解决方案 > 给定一个整数流,求平均值

问题描述

有一个连续的整数流,并且必须在任何给定实例上仅使用内存来计算平均值。

标签: average

解决方案


使用纳秒级分辨率,您的项目数也会在几天内溢出。

但是,您可以 - 而不是保留总和 - 保留旧的平均值并在新商品到达时重新称重。

private static void average(int... amount) {
    double average = (double) amount[0];
    for (double i = 1; i < amount.length; i++) {
        System.out.printf("average: %d%n", (int) average);
        double newWeight = (i + 1d) / i;
        double newAverage = average / newWeight;
        double thisAverage = (amount[(int)i]) / (i+1d);
        average = newAverage + thisAverage;
    }
    System.out.printf("average: %d%n", (int) average);
}

至于为什么会这样,假设你正在经历这些价值观

3、2、5

第一个值将导致平均值

3 / 1 = 3

(“1”是值的数量)。

现在,2来了。这意味着我们想要 (3+2)/2,或 (3/1)/2 + (2/2),因此我们将之前的平均值“3”除以 (1+2)/2。现在是新平均值

3/2 + 2/2 = 2.5

现在5来了。现在我们想要

(3+2+5)/3 = (3+2)/3 + 5/3

或 - 因为我们不再有 (3+2) 中的 3 和 2 -

= (3+2)/2 * 2/3

(3+2)/2 是旧平均值,2 是旧计数,3 是新计数。


推荐阅读