采访中有人问我这个问题。
我被要求计算x1,x2,x3,... xn的平均值
class Iterator {
bool hasNext;
int getNext();
}
//因此归结为这样的事情:
double average (Iterator & it) {
double average = 0;
double sum = 0;
int len = 0;
while (it.hasNext == true) {
sum += it.getNext();
}
if (len > 0)
average = sum / len;
}
面试官说清单的大小是未知的,而且可能很大,所以总和可能溢出。他问我如何解决溢出问题,我一直跟踪我们可能超过最大数的次数等等,因此他回答了。他说了一些有关推入堆栈,平均值和长度的事情,我从不真正理解他通过推入这些得出的解决方案2个变量变成某种列表?有人知道吗?
最佳答案
我不知道使用堆栈,但是在代数的帮助下,我们可以使用旧的平均值来推导新平均值的公式。
假设您已经对n - 1
项进行了平均,并且在oldAvg
中具有了该平均值。
oldAvg =(x1 + x2 + .. + xn-1)/(n-1)
新的平均值将由newAvg
表示:
newAvg =(x1 + x2 + .. + xn-1 + xn)/ n
通过一些代数运算,我们可以使用旧的平均值,平均的项目数和下一个项目来表示新的平均值。
newAvg =(x1 + x2 + .. + xn-1)/ n + xn / n
=((n-1)/(n-1))*(x1 + x2 + .. + xn-1)/ n + xn / n
= oldAvg / n *(n-1)+ xn / n
通过乘以n
再除以n - 1
可以避免溢出。然后,您所要做的就是添加下一项xn除以n
。
第一个循环将建立等于第一个元素的平均值,但是每个后续循环将使用上面的公式得出新的平均值。
n++;
newAvg = oldAvg / n * (n - 1) + it.next() / n;