2011-01-20 4 views
0

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

двойной [] хуг = новый двойной {10,1, 20,34, 35,46, 78,34, 98,67, 43,73 ........}

Теперь я хочу, чтобы найти среднее значение запаса по времени:

первой мин = Average (10,1) = 10,1 второй мин = Average (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

Я должен показать только последнее среднее значение в пользовательском интерфейсе. Посмотрев на различные варианты ниже, я использовал решение Oli, так как это лучше всего с точки зрения памяти и производительности. – Mahesh

+0

@Mahesh, если вам нужно показать только последнее среднее значение, вам просто нужно вычислить сумму, а затем разделите ** один раз **. – Andrey

2

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

An означает п-й минуты в среднем, Vn - п-й минуте цена.

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

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

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

+0

Математически это работает отлично. На практике это будет иметь кумулятивные ошибки, что приведет к дрейфующим результатам. –

+0

@ Oli Charlesworth true. но для текущей суммы не требуется большая переменная. – 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); 
} 
Смежные вопросы