Теория отвечает на вопрос «как растёт время при росте n?», а измерение показывает конкретное время на конкретной машине. Хороший инженер соединяет оба: выводит ожидание из анализа и проверяет замером. В этом уроке мы построим небольшие инструменты для эмпирической проверки сложности.

Протокол измерения

  1. Выберите размеры n и удваивайте их: n, 2n, 4n, ....
  2. Готовьте входные данные вне таймера.
  3. Для каждого размера повторяйте несколько раз и берите минимум: он наименее шумный.
  4. Посчитайте отношение T(2n) / T(n) или наклон в log-log масштабе.
  5. Сравните результат с теоретическим ожиданием.
СложностьОжидаемое T(2n) / T(n)наклон в log-log
O(1)≈ 10
O(log n)≈ 1 (чуть больше)≈ 0
O(n)21
O(n log n)чуть больше 2чуть больше 1
O(n^2)42
O(n^3)83
O(2^n)T(n + 1) / T(n) = 2не прямая

Функция-бенчмарк и отношения

bench возвращает лучший из повторов. ratio показывает, во сколько раз растёт время при удвоении размера. Результаты зависят от машины, поэтому мы проверяем ответ не точными секундами, а диапазоном.

python
import random
from time import perf_counter