Стандартное отклонение
Вы решили задачу. Теперь можно сравнить подходы.
Используем выборочное стандартное отклонение с делителем n−1.
Авторский разбор для локальной версии на основе условия задачи. Это не выгрузка чужих посылок и не официальное решение исходного сайта.
Ваше принятое решение
Рекомендуемое решение: Суммы и суммы квадратов целых чисел
Раскрытие скобок даёт сумму квадратов отклонений через сумму x и сумму x². Вычитание выполняется в точных целых числах Python, поэтому не возникает потери точности от вычитания близких float.
from math import sqrt
n = total = squares = 0
while True:
x = int(input())
if x == 0:
break
n += 1
total += x
squares += x * x
print(sqrt((n * squares - total * total) / (n * (n - 1))))
Время: O(n) арифметических операций; стоимость зависит от длины целых. Память: O(1) целочисленных накопителей, растущих с величиной суммы.
Другой способ: Два прохода по определению
Сначала вычисляем среднее, затем непосредственно суммируем квадраты отклонений. Формула хорошо видна в коде.
a = []
while True:
x = int(input())
if x == 0:
break
a.append(x)
from math import sqrt
mean = sum(a) / len(a)
print(sqrt(sum((x - mean) ** 2 for x in a) / (len(a) - 1)))
Время: O(n). Память: O(n) для последовательности.
На что обратить внимание
- Делитель равен n−1, а не n.
- Требуются хотя бы два элемента.
- Ноль завершает ввод и не участвует в вычислениях.
Рекомендация учитывает сложность и читаемость для этой задачи. Единственного самого быстрого решения для всех размеров входа и всех компьютеров может не быть.