Два решения могут давать одинаково правильный ответ, но одно работает мгновенно, а другое «думает» минутами на больших данных. Чтобы сравнивать решения, не запуская их, придумали язык оценки скорости — сложностьОценка роста числа операций/памяти при увеличении размера входа. Записывается как O(n). (Big O).
Big O — язык скорости
Сложность показывает, как растёт число операций при увеличении размера входных данных n. Записывается как «O от чего-то». Аналогия: неважно, насколько быстрый у вас компьютер — важно, во сколько раз больше работы появится, если данных станет вдвое больше. Это главный критерий, по которому на LeetCode оценивают решение.
Обозначение
Название
Пример
O(1)
постоянная
доступ по индексу, dict[key]
O(log n)
логарифмическая
бинарный поиск
O(n)
линейная
один проход по списку
O(n log n)
—
хорошая сортировка
O(n²)
квадратичная
вложенные циклыКонструкция, повторяющая блок кода: for перебирает элементы, while — пока условие истинно.
Как считать на практике
Простое правило для начала:
Один цикл по данным → O(n).
Цикл внутри цикла по тем же данным → O(n²).
Доступ к элементу спискаИзменяемая упорядоченная коллекция элементов: [1, 2, 3]. По-английски list. по индексу или поиск в словареКоллекция пар «ключ → значение»: {"a": 1}. Быстрый доступ по ключу. По-английски dict./множестве → O(1).
Наглядно: при n = 1000алгоритмЧёткая последовательность шагов для решения задачи за конечное число действий. O(n) сделает ~1000 шагов, а O(n²) — миллион. Разница колоссальная.
▶ complexity.py
Разберём разницу: в «медленной» версии для каждого элемента мы ещё раз пробегаем по оставшимся — это два вложенных цикла, O(n²). В «быстрой» версии мы один раз проходим по списку и спрашиваем у множестваКоллекция уникальных элементов без порядка: {1, 2, 3}. По-английски set. «видели ли мы это число?» — проверка в set мгновенна, O(1). Итого один проход — O(n).
📝Заметка
Оба решения выше дают правильный ответ, но второе на больших данных в тысячи раз быстрее. Словари и множества — главный инструмент ускорения: они превращают O(n²) в O(n). Это идея №1 на LeetCode.
💡Совет
Предскажите. Если в списке 1000 элементов, сколько примерно операций сделает алгоритм с двумя вложенными циклами по списку? Подсказка: n × n.
Около миллиона (1000 × 1000). Именно поэтому вложенные циклы по большим данным опасны — и почему так ценится умение свести задачу к одному проходу.
⚠️ Частые ошибки новичков
Ошибка. Использовать x in list внутри цикла для поиска дубликатов — это незаметно превращает решение в O(n²), потому что каждая такая проверка сама по себе перебор. Для частых проверок наличия используйте set, и проверка станет O(1).
Заданиерешение.py
Напишите быструю функцию has_duplicate(nums) за O(n): возвращает True, если в списке есть повторяющиеся числа. Используйте множество.
❓Проверь себя
Какая сложность у одного цикла for по списку из n элементов?
Что обычно даёт два вложенных цикла по одному списку?
Какая операция работает за O(1)?
ℹ️Важно
✅ Что вы узнали
Сложность (Big O) показывает рост числа операций при увеличении n.
Один цикл — O(n), вложенные циклы — O(n²), доступ по ключу/индексу — O(1).
Множества и словари превращают O(n²) в O(n) — главный приём ускорения.
Комментарии
Загрузка…
Загрузка комментариев…