Есть ли способ рассчитать среднее расстояние элементов массива от среднего значения массива, только «посетив» каждый элемент массива один раз? (ищу алгоритм)
Пример:
Array : [ 1 , 5 , 4 , 9 , 6 ]
Average : ( 1 + 5 + 4 + 9 + 6 ) / 5 = 5
Distance Array : [|1-5|, |5-5|, |4-5|, |9-5|, |6-5|] = [4 , 0 , 1 , 4 , 1 ]
Average Distance : ( 4 + 0 + 1 + 4 + 1 ) / 5 = 2
Простому алгоритму требуется 2 прохода.
1-й проход) Считывает и накапливает значения, затем делит результат на длину массива, чтобы вычислить среднее значение элементов массива.
2-й проход) Считывает значения, накапливает расстояние каждого из ранее рассчитанного среднего значения, а затем делит результат на длину массива, чтобы найти среднее расстояние элементов от среднего значения массива.
Два прохода идентичны. Это классический алгоритм вычисления среднего значения набора значений. Первый принимает на вход элементы массива, второй — расстояния каждого элемента от среднего значения массива.
Вычисление среднего можно изменить, чтобы не накапливать значения, а вычислять среднее значение «на лету», когда мы последовательно считываем элементы из массива.
Формула:
Compute Running Average of Array's elements
-------------------------------------------
RA[i] = E[i] {for i == 1}
RA[i] = RA[i-1] - RA[i-1]/i + A[i]/i { for i > 1 }
Где A[x] — элемент массива в позиции x, RA[x] — среднее значение элементов массива между позицией 1 и x (скользящее среднее).
Мой вопрос:
Есть ли аналогичный алгоритм для вычисления "на лету" (когда мы читаем элементы массива) среднее расстояние элементов от среднего значения массива?
Проблема в том, что когда мы читаем элементы массива, конечное среднее значение массива неизвестно. Известно только среднее значение. Таким образом, вычисление разницы от скользящего среднего не даст правильного результата. Я предполагаю, что если такой алгоритм существует, он, вероятно, должен иметь «способность» компенсировать вычисленную до сих пор ошибку при каждом новом чтении элемента.