Сложность алгоритма (Big-O)
Чтобы сравнивать алгоритмы, оценивают их временную и пространственную сложность. Разберём нотацию Big-O, основные классы сложности и то, насколько они различаются на больших данных.
Список тем (3 из 3)
Глава 1. Введение в информационные технологии
Глава 2. Основы программирования
Одну задачу можно решить разными алгоритмами, и чтобы их сравнивать, вводят понятие сложности. Временная сложность — число элементарных операций, которые выполняет алгоритм, в зависимости от размера входных данных 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 порядок сложности влияет сильнее, чем скорость устройства.
Практические задания
- Приведите к виду Big-O следующие выражения: 5n + 20, n² + 3n + 7, 100, n log n + n, 2^n + n³.
- Определите и объясните временную сложность трёх фрагментов: один цикл
for i in range(n): s += i; два вложенных цикла, оба поrange(n); циклwhile i < n: i = i * 2(вначалеi = 1). - Для случайных списков длиной n = 1000, 2000, 4000, 8000 измерьте модулем
timeвремя работы сортировки пузырьком и встроеннойsorted(); запишите в таблицу, как растёт время, и сравните с теоретической сложностью.
Вопросы для закрепления
Проверьте себя: сначала подумайте, потом откройте ответ.
1Почему в нотации Big-O постоянные множители отбрасываются?Показать ответСкрыть ответ
При большом n решает порядок роста, а постоянный множитель его не меняет и зависит от компьютера.2Какова общая сложность, если два последовательных блока имеют сложность O(n) и O(n²)?Показать ответСкрыть ответ
O(n + n²) = O(n²): остаётся наибольшее слагаемое.3Во сколько раз примерно различается число операций у алгоритмов O(n²) и O(n log n) при n = 1000?Показать ответСкрыть ответ
n² = 1 000 000, а n log2 n ≈ 10 000, то есть примерно в 100 раз.
Войдите на сайт
Слайды и PDF доступны только зарегистрированным пользователям: и просмотр, и скачивание. Вход бесплатный.
Войдите на сайт
Слайды и PDF доступны только зарегистрированным пользователям: и просмотр, и скачивание. Вход бесплатный.
Пройдено тем: 0 из 3
Войти и отметить