Оценка сложности алгоритмов: асимптотическая O-нотация
Теория вычислительной сложности, O-нотация («О-большое»), временная и пространственная сложность, классы O(1), O(log n), O(n), O(n log n), O(n^2).
Одну и ту же задачу программист может решить десятками различных способов. Но как объективно сравнить два алгоритма и понять, какой из них лучше?
Почему нельзя просто замерить время секундомером на компьютере?
• Время на реальном ПК зависит от мощности процессора, загруженности системы другими процессами, языка программирования и скорости оперативной памяти. На мощном сервере плохой алгоритм может выполниться за 1 секунду, а на слабом ноутбуке хороший алгоритм — за 2 секунды.
Теория сложности алгоритмов оценивает не физические секунды, а количество элементарных операций в зависимости от размера входных данных n (длины массива, размера строки). Это позволяет объективно сравнивать алгоритмы независимо от типа компьютера.
Вычислительная сложность
Независимость от ПК
Асимптотическая сложность описывает поведение алгоритма при устремлении размера входных данных n к бесконечности (). Для записи используется математическая нотация («О-большое» / Big O Notation).
Правила вычисления O-нотации:
1. Константные множители отбрасываются: алгоритмы с формулами операций , и имеют одинаковую асимптотическую сложность ;
2. Младшие слагаемые отбрасываются: если время работы описывается многочленом , при больших n (например, ) слагаемое полностью доминирует над . Поэтому сложность равна .
O-нотация (Big-O)
Иерархия сложности от самых быстрых к самым медленным:
1. — константное время: не зависит от размера данных (доступ к элементу списка по индексу a[i], получение значения из словаря по ключу);
2. — логарифмическая сложность: время растет крайне медленно (бинарный поиск);
3. — линейная сложность: один цикл по массиву (поиск минимума, подсчет суммы sum(a));
4. — квазилинейная сложность: оптимальные алгоритмы быстрой сортировки (MergeSort, QuickSort, Timsort в Python a.sort());
5. — квадратичная сложность: два вложенных цикла (пузырьковая сортировка, перебор всех пар элементов);
6. — экспоненциальная сложность: перебор всех подмножеств, наивные числа Фибоначчи. При программа не завершится до конца существования Вселенной!
O(1) и O(log n)
O(2^n) Экспонента
Помимо времени выполнения программы, инженеры обязаны оценивать и пространственную сложность (Space Complexity) — объем дополнительной оперативной памяти, требуемой алгоритму сверх самих входных данных.
Например, пузырьковая сортировка сортирует элементы прямо на месте без создания копий массива (дополнительная память ), в то время как сортировка слиянием (MergeSort) требует выделения дополнительного вспомогательного массива размера .
