2017-04-20 208 views
0

我有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-平均) –

回答

0

您可以利用遞歸的,以避免重新計算增量總和:

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) 
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