2011-01-20 2 views
0

나는 주식의 가격입니다 숫자의 배열을 가지고에서 요소를 하나의 배열에 대한 평균을 찾기 :아래 주어진 시간

더블 [] XYZ = 새로운 더블 {10.1, 20.34, 35.46, 78.34, 98.67, 43.73 ........}

지금, 내가 시간을 기준으로 주식의 평균을 찾으려면 :

1 분 = 평균 (10.1) = 10.1 2 분 = 평균 (10.1 + 20.34) = 15.22 3 분 = 평균 (10.1 + 20.34 + 35.46) = 21.96

이 작업을 수행하는 한 가지 방법은 분 (1,2,3,4 ...) 회 반복하고 평균을 찾는 것입니다. 하지만 내 목록이 너무 커지면 성능 문제가 될 수 있습니다.

매번 평균을 찾는 다른 방법이 있습니까?

고마워요.

마헤이

답변

6

예, 누적 합계 유지 :

sum = 0; 
num = 0; 

foreach (element i) 
{ 
    sum += i; 
    num ++; 
    average = sum/num; 
} 

sum 등이 그것이 절대 그런 일 없을 오버 플로우에 대해 충분히 큰 유형을 선택합니다.

+0

평균 배열을 만들어 각 요소를 반복 할 때마다 채울 수 있습니다. – Lazarus

+0

UI의 최신 평균 만 표시해야합니다. 아래의 다양한 옵션을 살펴본 후에 Oli의 솔루션을 사용하여 메모리와 성능면에서 가장 좋습니다. – Mahesh

+0

@Mahesh 마지막 평균만을 보여 주면 합계를 계산 한 다음 ** 한번 **으로 나눠야합니다. – Andrey

2

하면 다음의 재귀 식을 사용하여 (단일 패스) O(n) 그들을 계산할 수

An 제 n 분의 평균 수단을 Vn - 제 n 분 가격.

An = (An-1 * (n - 1) + Vn)/n 

그래서 반복하여 보관하십시오. An.

PS : 정확하게 이해했다면 매분마다 평균 가격을 찾고 싶습니다. 단 평균이 아닙니다.

+0

수학적으로 이것은 잘 동작합니다. 실제로는 누적 오류가 발생하여 연속적인 결과가 표류하게됩니다. –

+0

@Oli Charlesworth 사실입니다. 합계를 계산하기 위해 큰 변수가 필요하지 않습니다. – Andrey

+0

또한 사실입니다! 그러나 'An-1 * (n-1)'은 'sum'만큼 큰 것입니다 ... –

0

일부 지속성이 필요합니다.

아마도 개체입니까? AverageObj는 카운터와 합계 필드를 포함합니다.

0
double[] xyz=new double{ 10.1, 20.34, 35.46, 78.34, 98.67, 43.73 ........ } 

double[] averages = new double[xyz.Length]; 

averages[0] = xyz[0]; 
for(int i = 1; i < xyz.Length; i++) 
{ 
    averages[i] = (((averages[i-1] * i) + xyz[i])/i+1); 
} 
관련 문제