Есть ли способ рассчитать среднее расстояние элементов массива от среднего значения массива, просто «посетив» каждый элемент массива один раз? (Я ищу алгоритм)
Пример:
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 (скользящее среднее).
Мой вопрос:
Существует ли аналогичный алгоритм для вычисления "на лету" (когда мы читаем элементы массива) среднего расстояния элементов от среднего значения массива?
Проблема в том, что при чтении элементов массива окончательное среднее значение массива неизвестно. Известно только скользящее среднее. Таким образом, расчет отличий от скользящего среднего не даст правильного результата. Я полагаю, что если такой алгоритм существует, он, вероятно, должен иметь возможность «компенсировать», таким образом, каждый новый элемент, считанный для ошибки, вычисленной до настоящего момента.