使用java计算增量平均值

使用java计算增量平均值

问题描述:

我有2个数组,我想计算增量平均值并将其再次存储在数组中。我举了一个例子。使用java计算增量平均值

int[] arr1 = {1,1,2,3,4,4,4,4,5,6}; 
int[] arr2 = {8,9,2,4,5,7,1,8,3,6}; 

计算之后,我想输出作为

int[] arr1 = {1,2,3,4,5,6} 
double[] average = {8.5,6.3333,5.75,5.5,5.222,5.3} 

平均工作原理是这样, 对于图1中ARR1平均值为8 + 9/2

对于2,平均是8+ 9 + 2/3等

我已经写了一个for循环这样做,但我想做一些更快的计算,因为我的原始数据是800的大小和值为1400000和d已经排序。有什么建议吗?

+1

如果你已经有一个工作解决方案,但希望它的改进这可能是一个更好的适合https://codereview.stackexchange.com/ –

+0

如果你的解决方案只有一个for循环我因为你有一个“o(n)”解决方案,所以t不可能变得更好。但如果你有嵌套循环你的代码可以有一个改进 – Lrrr

+1

也许你想看看这里[估计增量平均](https://math.stackexchange.com/questions/106700/incremental-平均) –

您可以利用递归的,以避免重新计算增量总和:

Avg(a,b,c) = (a + b + c)/3 

Avg(a,b,c,d) = (a + b + c + d)/4 
      = (a + b + c)/4 + d/4 
      = ((a + b + c)/3) * 4/3 + d/4 
      = Avg(a,b,c) * 4/3 + d/4 

=> Avg (x1->xn+1) = Avg(x1->xn) * (n+1)/n + xn+1/(n+1) 

你可以使用DP。如果你正在使用嵌套循环,这可能意味着你正在计算循环中每个元素的平均值。为了使你的代码的运行速度,你可以只使用一个循环是这样的:

int[] input = {1,1,2,3,4,4,4,4,5,6}; 
double[]average = new double[input.length]; 
double ave = 0; 
for(int i = 0 ; i< input.length ; i++) 
{ 
    ave = (input[i] + ave * i)/(i+1); 
    average[i] = ave; 
} 

PS:你的答案是错的正确答案是:

{1.0 , 1.0 , 1.3333333333333333 , 1.75 , 2.2 , 2.5 , 2.7142857142857144 , 2.875 , 3.111111111111111 , 3.4} 

{8.0 , 8.5 , 6.333333333333333 , 5.75 , 5.6 , 5.833333333333333 , 5.142857142857143 , 5.5 , 5.222222222222222 , 5.3} 
+0

No. No.我可能在解释时犯了一个错误。它是一个误解。平均值是为'arr2'而不是'arr1'计算的。第二点,'arr1'中的条目是重复的。就像我有2个值为1,所以在我的计算后,我想要独特的值。和平均计算是这样的, 1,(8 + 9)/ 2 2,(8 + 9 + 2)/ 3 3,(8 + 9 + 2 + 4)/ 4 对于4,(8 + 9 + 2 + 4 + 5 + 7 + 1 + 8)/ 8 – Riddhi

+0

@Riddhi我仍然无法理解你的问题,请解释你如何在'average'而不是'9'中使用'6'元素。 ?请解释'average'中的每个元素以及'arr1'的用途是什么? – Lrrr