Мини-урок · перед практикой

Стандартное отклонение

Используем выборочное стандартное отклонение с делителем n−1.

Как к ней подойти

Разберитесь, как повторять действие, пока выполняется условие, и вовремя остановить цикл.

Коротко о теме

Цикл while продолжается, пока условие истинно. Продумайте, какое значение меняется на каждом шаге и почему цикл когда-нибудь завершится. Проверяйте как обычный ввод, так и случай, когда тело цикла выполняется ноль раз.

Ключевая идея · Суммы и суммы квадратов целых чисел

Раскрытие скобок даёт сумму квадратов отклонений через сумму x и сумму x². Вычитание выполняется в точных целых числах Python, поэтому не возникает потери точности от вычитания близких float.

Проверьте перед запуском

  • Делитель равен n−1, а не n.
  • Требуются хотя бы два элемента.
  • Ноль завершает ввод и не участвует в вычислениях.

Сравните свой подход

Ниже - готовое решение, другой способ, если он есть, и важные детали проверки.

Ваше принятое решение

Рекомендуемое решение: Суммы и суммы квадратов целых чисел

Раскрытие скобок даёт сумму квадратов отклонений через сумму 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) для последовательности.