Перейти к основному содержимому
Informatik.uz
Бакалавриат · 1-й курсГлава 2. Основы программирования

Сложность алгоритма (Big-O)

Чтобы сравнивать алгоритмы, оценивают их временную и пространственную сложность. Разберём нотацию Big-O, основные классы сложности и то, насколько они различаются на больших данных.

Тема 3 из 3Чтение: 2 минОбновлено: 27 октября 2026 г.
Список тем (3 из 3)

Глава 1. Введение в информационные технологии

  1. 1Кодирование информации и двоичная система счисления

Одну задачу можно решить разными алгоритмами, и чтобы их сравнивать, вводят понятие сложности. Временная сложность — число элементарных операций, которые выполняет алгоритм, в зависимости от размера входных данных n, а пространственная сложность — объём дополнительной памяти. Считают именно операции, а не секунды, потому что время работы зависит от компьютера и языка программирования.

Нотация Big-O (О-большое) оценивает порядок роста функции сверху. Формальное определение: если найдутся константа c > 0 и число n0 такие, что для всех n ≥ n0 выполняется f(n) ≤ c · g(n), то говорят, что f(n) = O(g(n)). На практике постоянные множители и слагаемые низшего порядка отбрасывают: 3n + 5 = O(n), n² + 100n = O(n²). Обычно оценивают худший случай работы алгоритма.

Самые распространённые классы сложности расположены по скорости роста. O(1) — константная (например, обращение к элементу a[i]); O(log n) — логарифмическая (двоичный поиск); O(n) — линейная (один цикл, например for x in a: s += x); O(n log n) — эффективная сортировка (сортировка слиянием, Timsort); O(n²) — квадратичная (два вложенных цикла, сортировка пузырьком); O(2^n) — экспоненциальная (перебор всех подмножеств множества из n элементов). Сложности последовательных блоков складываются, и остаётся наибольшая, а сложности вложенных циклов перемножаются.

На больших n разница огромна. Если считать, что компьютер выполняет около 100 миллионов простых операций в секунду, то при n = 1 000 000 алгоритм O(n) работает около сотой доли секунды, алгоритм O(n log n) — примерно 0,2 секунды, а алгоритм O(n²) занимает около 10 000 секунд, то есть почти 3 часа. Поэтому на больших данных сложность алгоритма влияет на время работы сильнее, чем скорость устройства.

Главное

  • Сложность показывает, как число операций алгоритма (или объём памяти) зависит от размера входных данных n.
  • Big-O оценивает порядок роста сверху; постоянные множители и слагаемые низшего порядка отбрасываются.
  • Основные классы: O(1), O(log n), O(n), O(n log n), O(n²), O(2^n) — скорость роста увеличивается.
  • Сложности последовательных блоков складываются, вложенных циклов — перемножаются.
  • При большом n порядок сложности влияет сильнее, чем скорость устройства.

Практические задания

  1. Приведите к виду Big-O следующие выражения: 5n + 20, n² + 3n + 7, 100, n log n + n, 2^n + n³.
  2. Определите и объясните временную сложность трёх фрагментов: один цикл for i in range(n): s += i; два вложенных цикла, оба по range(n); цикл while i < n: i = i * 2 (вначале i = 1).
  3. Для случайных списков длиной n = 1000, 2000, 4000, 8000 измерьте модулем time время работы сортировки пузырьком и встроенной sorted(); запишите в таблицу, как растёт время, и сравните с теоретической сложностью.

Вопросы для закрепления

Проверьте себя: сначала подумайте, потом откройте ответ.

  1. 1Почему в нотации Big-O постоянные множители отбрасываются?
    При большом n решает порядок роста, а постоянный множитель его не меняет и зависит от компьютера.
  2. 2Какова общая сложность, если два последовательных блока имеют сложность O(n) и O(n²)?
    O(n + n²) = O(n²): остаётся наибольшее слагаемое.
  3. 3Во сколько раз примерно различается число операций у алгоритмов O(n²) и O(n log n) при n = 1000?
    n² = 1 000 000, а n log2 n ≈ 10 000, то есть примерно в 100 раз.

Пройдено тем: 0 из 3

Войти и отметить