Выполняется сравнительный анализ запущенного процесса, при котором следующие числа вычисляются «кумулятивно» (из предыдущих значений + новый элемент):
- Минимальная продолжительность
- Максимальная продолжительность
- Средняя продолжительность
Стандартное отклонение (σ) продолжительности должно быть также вычисляется, потому что он указывает на статистический разброс.
Исходя из приложения, неудобно хранить каждый элемент / номер, поэтому необходимо вычислять его относительно предыдущего значения и нового элемента.
Пример:
NewElement Min Max Avg StdDev // AllElements (which are NOT meant to be stored)
1 1 1 1 - [1]
2 1 2 1.5 0.5 [1,2]
3 1 3 2 0.8164965809277 [1,2,3]
4 1 4 2.5 1.1180339887499 [1,2,3,4]
0 0 4 2 1.4142135623731 [1,2,3,4,0]
(И это онлайн-калькулятор SD для справочных значений)
Упрощенная версия цели:
const calculateNewStats = (stats, newElement) => {
const newStats = {};
newStats.count = stats.count + 1;
newStats.min = Math.min(stats.min, newElement);
newStats.max = Math.max(stats.max, newElement);
newStats.avg = (stats.avg * stats.count + newElement) / newStats.count;
// newStats.sd = ??? that's the problem
return newStats;
};
// initial values
let stats = {
count: 0,
min: 0,
max: 0,
avg: 0,
// initial SD is theoretically controversial (N/A), but that's not the point
sd: 0,
};
// loopStart goes here ... an infinite one
// many things goes here ... eventually, we have a `newElement`
stats = calculateNewStats(stats, newElement);
// loopEnd goes here
Некоторое время был произведен поиск, были найдены и тщательно применены некоторые математические уравнения (например, this), но в результате числа не были правильными.
newStats.avg = (stats.total + newElement) / newStats.count;
(Вместо хранения среднего, это просто результат, вычисленный из общего количества.) Это позволяет вам накапливать больше элементов с меньшими затратами, если у вас когда-либо будет несколько элементов для добавления без необходимости дорогие дополнительные выходы для каждого. 22.06.2019count
является целым числом, аtotal
is, если вы передаете только целочисленные входные данные. Но одно из ваших средних значений в вашем примере в вопросе -1.5
. Бывает, что1.5
можно представить точно какdouble
, но среднее значение[1, 0, 0]
равно1/3
, что не может быть представлено точно. Только дроби со знаменателем степени двойки могут быть точно представлены двоичным числом с плавающей запятой. В любом случае, отслеживание итогов - это меньше общей работы, чем отслеживание среднего. 22.06.2019