2017-04-20 11 views
0

2 개의 배열이 있고 나는 증분 평균을 계산하여 배열에 다시 저장하려고합니다. 나는 예를 든다. 계산 후의자바를 사용하여 증분 평균 계산하기

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

전 평균 arr1이 같은

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

평균 일, 1은 2 들어 8 + 2분의 9

같이, 평균 출력 할 8+ 9 + 2/3 등

나는 그것을 수행하는 for 루프를 작성했지만 원래 데이터가 크기 800이고 값이 1400000으로 더 빠른 계산을하고 싶다. d가 이미 정렬되었습니다. 제안이 있습니까?

+1

하는 경우 이미 작동중인 솔루션이 있지만 개선이 필요하다 https://codereview.stackexchange.com/ –

+0

솔루션에 루프 i가 하나만있는 경우 당신이'o (n)'해결책을 가지고 있기 때문에 그것을 더 좋게 만들 수 없습니다. 하지만 중첩 된 루프가 있다면 코드는 개선 될 수 있습니다 – Lrrr

+1

어쩌면 여기를보고 싶을 것입니다 [https://math.stackexchange.com/questions/106700/incremental-averageing] (증분 평균) –

답변

0

당신은 증가 금액을 재 계산하지 않도록하기 위해 재귀를 활용할 수 있습니다 : 당신은 DP을 사용할 수

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

. 중첩 된 루프를 사용하는 경우 루프의 각 요소에 대한 평균을 계산하고있는 것입니다.

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

번을 편집 할 것입니다. 설명을 잘못했을 수도 있습니다. 그것의 오해. 평균은 'arr1'이 아니라'arr2 '에 대해 계산됩니다. 두 번째로,'arr1'의 엔트리는 중복됩니다. 마찬가지로 2 값 1, 그래서 내 계산 후 고유 값을 원합니다. 평균 계산 1 (8 + 9) 2/2 (8 + 9 + 2) 3/3 (8 + 9 + 2 + 4)/4 , 이렇게되면 (8 + 9 + 2 + 4 + 5 + 7 + 1 + 8)/8 – Riddhi

+0

@ Riddhi 여전히 문제는 이해할 수 없다. '9'대신'average'에'6' 요소가 어떻게 있는지 설명해주십시오. ? 각 요소를 '평균'으로 설명하고 'arr1'의 목적은 무엇입니까? – Lrrr