Нахождение среднего для массива элементов по одному - PullRequest
0 голосов
/ 20 января 2011

У меня есть массив чисел, которые являются ценами на акции, как указано ниже:

double[] xyz=new double{ 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 ...) и найти среднее.Но, поскольку мой список очень большой, это может стать проблемой производительности.

Есть ли другой способ найти среднее значение каждый раз?

Большое спасибо.

Махеш

Ответы [ 4 ]

6 голосов
/ 20 января 2011

Да, поддерживать текущую сумму:

sum = 0;
num = 0;

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

Выберите достаточно большой тип для sum, чтобы он никогда не переполнялся.

2 голосов
/ 20 января 2011

Вы можете вычислить их в O(n) (за один проход), используя следующую рекурсивную формулу:

An означает среднее значение за n-ю минуту, Vn - цена за n-ю минуту.

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

Так что вы зацикливаетесь и сохраняете предыдущий An.

PS : Если я вас правильно понял, вы хотите найти среднее значение цены за каждую минуту, а не одно среднее.

0 голосов
/ 20 января 2011
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);
}
0 голосов
/ 20 января 2011

Вам нужна некоторая форма настойчивости.

Возможно, объект? AverageObj, который содержит счетчик и поле суммы.

...