📘 CodingMarble Learn

Сложность алгоритма: как быстро растёт число шагов?

Одну и ту же задачу можно решить разными алгоритмами, но одним нужно намного больше шагов. Алгоритм оценивают не секундомером, а числом простых шагов при росте размера входных данных n. Нотация Big O называет тип роста: O(1) константный, O(log n) логарифмический, O(n) линейный, O(n log n) и O(n²) квадратичный. Линейный поиск работает за O(n), бинарный за O(log n); пузырьковая сортировка за O(n²), сортировка слиянием за O(n log n). Объём используемой памяти называется пространственной сложностью.

🎬 История по шагам

  1. Найдите число 13 в 16 коробках, открывая их по одной. Каждая открытая коробка это один шаг. Так работает линейный поиск: до n шагов.
  2. Если коробки стоят по порядку, откройте среднюю и выбросьте неподходящую половину. Повторяйте. Бинарный поиск находит 13 всего за 4 шага.
  3. Теперь сравним пять видов алгоритмов при n = 16. Высота столбика показывает число шагов. Одни остаются крошечными, один огромный.
  4. Увеличьте входные данные с 8 до 16. O(n) вырастает вдвое, O(n²) становится в четыре раза больше, а O(log n) растёт всего на 1.
  5. Сортировка 1000 элементов: пузырьковой нужно около миллиона сравнений, сортировке слиянием только около десяти тысяч. Для больших данных важнее всего скорость роста.
  6. Ваш ход: двигайте ползунок n от 2 до 1024. Смотрите, какой столбик взлетает быстрее всех.

Совет: тяни 3D-сцену, чтобы повернуть её. Двумя пальцами можно приблизить.

🤔 Частые сомнения — разобраны

Почему бы просто не измерить время программы секундомером?

Время меняется от компьютера к компьютеру, а число шагов нет. В шаге 1 мы считаем открытые коробки, а не секунды.

Почему бинарный поиск может пропустить половину коробок?

Коробки стоят по порядку. Если средняя меньше искомого числа, то всё слева от неё тоже меньше, и ни одна из них не может быть ответом. Посмотрите на серые коробки в шаге 2.

Почему в Big O мы отбрасываем константы?

Big O говорит о том, как быстро растёт работа. И 2n, и n удваиваются, когда n удваивается, значит растут одинаково. Шаг 4 показывает удвоение.

Всегда ли O(n²) медленнее, чем O(n log n)?

При очень маленьком n он может быть даже быстрее, но с ростом n квадрат быстро обгоняет. В шаге 5 при n = 1000 разница примерно в 100 раз.

Что на самом деле означает log n?

log₂ n это сколько раз можно поделить n пополам, пока не получится 1. Для 1024 это 10. Двигайте ползунок в последнем шаге и смотрите, как синий столбик растёт всего на 1 при каждом удвоении n.

Много алгоритмов для одной задачи

Алгоритм это набор точных шагов для решения задачи. Большинство задач можно решить не одним алгоритмом. Например, чтобы найти имя в списке, можно проверить каждое имя или (если список упорядочен) всё время делить его пополам.

Оба способа дают верный ответ. Разница в эффективности: сколько работы и памяти нужно каждому. Хороший программист выбирает алгоритм, который остаётся быстрым, когда данных становится много.

Сравнение алгоритмов по времени работы

Измерять секундомером нечестно: быстрый компьютер делает медленный алгоритм похожим на хороший. Поэтому мы считаем простые шаги (сравнения, обмены, сложения) как функцию от размера входных данных n.

Лучший, средний и худший случай

Лучший случай это самые удачные данные (13 лежит в первой коробке: 1 шаг). Худший случай это самые неудачные (13 нет: n шагов). Обычно называют худший случай, потому что это гарантия: алгоритм никогда не будет медленнее.

Временная и пространственная сложность

Временная сложность показывает, как растёт число шагов с ростом n. Пространственная сложность показывает, как растёт дополнительная память с ростом n. Сортировка слиянием быстрая, но требует дополнительной памяти; пузырьковой почти не нужна дополнительная память, но она медленная.

Нотация Big O

Big O описывает скорость роста, не обращая внимания на мелкие детали. Мы оставляем только самое большое слагаемое и отбрасываем постоянные числа: 3n² + 5n + 2 превращается в O(n²), потому что при большом n часть n² это почти всё.

Big OНазваниеn = 16n = 1000Пример
O(1)константная11прочитать элемент 5 массива
O(log n)логарифмическая4около 10бинарный поиск
O(n)линейная161000линейный поиск, поиск наибольшего
O(n log n)n log n64около 10 000сортировка слиянием
O(n²)квадратичная2561 000 000пузырьковая сортировка, вложенные циклы

Быстрое правило для кода: один цикл по n элементам это O(n); цикл внутри цикла это O(n²); деление задачи пополам на каждом шаге это O(log n).

Эффективность линейного и бинарного поиска

Линейный поиск проверяет элементы по одному. Худший случай: n сравнений, то есть O(n). Он работает с любым списком, упорядоченным или нет.

Бинарному поиску нужен упорядоченный список. Смотрим на середину; если она слишком большая, отбрасываем правую половину, иначе левую. Каждый шаг делит список пополам, поэтому в худшем случае нужно около log₂ n + 1 сравнений: O(log n). Для 1 000 000 элементов это около 20 шагов вместо 1 000 000.

Эффективность алгоритмов сортировки

Пузырьковая сортировка, сортировка вставками и выбором используют цикл внутри цикла, поэтому им нужно около n²/2 сравнений: O(n²). Сортировка вставками в лучшем случае (список уже упорядочен) работает за O(n).

Сортировка слиянием делит список пополам примерно log₂ n раз и на каждом уровне делает около n работы: O(n log n). Ей нужно O(n) дополнительной памяти.

Бинарному поиску нужен упорядоченный список. Если искать только один раз, сначала сортировать (n log n) дороже, чем один линейный поиск (n). Если искать много раз, один раз отсортировать выгодно.

Предусловия, постусловия и ловушки рекурсии

Предусловие это то, что должно быть верно до начала алгоритма (для бинарного поиска: список упорядочен). Постусловие это то, что гарантировано после окончания (для сортировки: каждый элемент меньше или равен следующему). Если записать их, алгоритм проще проверять и доказывать.

Рекурсия означает, что функция вызывает сама себя для меньшей задачи. Частые ошибки:

Попробуйте: гонка двух поисков

Напишите числа от 1 до 32 на бумажках и разложите их по порядку лицом вниз. Пусть друг загадает число. Сначала ищите по одной бумажке и считайте, сколько перевернули. Потом ищите, всегда переворачивая среднюю бумажку. Повторите 5 раз. Какому способу ни разу не понадобилось больше 6 переворотов? Проверьте ползунком в последнем 3D-шаге (n = 32: log₂ 32 = 5).

Главные формулы и определения

Разобранные примеры

1. В списке 50 имён. Сколько сравнений нужно линейному поиску в лучшем и в худшем случае?

Лучший случай: имя первое → 1 сравнение. Худший случай: имя последнее или его нет → 50 сравнений. Линейный поиск это O(n).

2. Какое наибольшее число сравнений нужно бинарному поиску в упорядоченном списке из 1024 элементов?

Каждый шаг делит список пополам: 1024 → 512 → 256 → 128 → 64 → 32 → 16 → 8 → 4 → 2 → 1. Это 10 делений, плюс последняя проверка: не больше 11 сравнений (log₂ 1024 = 10).

3. Найдите Big O для f(n) = 4n² + 10n + 7.

Оставляем самое большое слагаемое (4n²) и отбрасываем константу 4: O(n²).

4. Цикл по i идёт от 1 до n, а внутри него другой цикл по j идёт от 1 до n. Сколько раз выполнится строка во внутреннем цикле?

n раз для каждого из n значений i: n × n = n². Временная сложность O(n²).

5. Программа с O(n²) сортирует 1000 элементов за 2 секунды. Примерно сколько времени она займёт для 3000 элементов?

n становится в 3 раза больше, значит n² становится в 3² = 9 раз больше: примерно 2 × 9 = 18 секунд.

6. Сравните пузырьковую сортировку и сортировку слиянием для n = 1000 элементов.

Пузырьковая: около n²/2 = 500 000 сравнений. Слиянием: около n log₂ n = 1000 × 10 = 10 000. Сортировка слиянием делает примерно в 50 раз меньше работы, но ей нужна дополнительная память.

Частые ошибки

Тренировочный тест

1. Какова временная сложность линейного поиска в худшем случае?
2. Бинарный поиск работает только если список:
3. Если n удваивается, алгоритму O(n²) нужно примерно:
4. Какая сортировка работает за O(n log n)?
5. Big O для 7n + 300 равно:

Практика: отвечай сам

Введи или выбери ответ и нажми «Проверить». Если застрял, возьми подсказку; полное решение появится после ответа.

Частые вопросы

Что такое временная сложность простыми словами?

Она показывает, как растёт число шагов алгоритма, когда входных данных становится больше. Например, O(n) означает: данных вдвое больше, шагов вдвое больше.

Чем отличаются временная и пространственная сложность?

Временная сложность измеряет шаги, а пространственная дополнительную память. Алгоритм может быть быстрым, но занимать много памяти, как сортировка слиянием.

Какой Big O самый быстрый?

O(1) (константный) лучший, дальше O(log n), O(n), O(n log n), O(n²), а экспоненциальный O(2ⁿ) худший из частых.

Где это изучают

Canada (Ontario)Grade 12C. Designing Modular Programs
Ukraine11 класAlgorithms
England (GCSE, A level)Year 103.1 Fundamentals of algorithms
USA (Common Core, NGSS, AP)Grade 11Selection and Iteration
USA (Common Core, NGSS, AP)Grade 11Algorithms and Programming
South Korea고등학교 2학년Algorithms and programming
South Korea고등학교 3학년Abstraction and algorithms

Сначала изучи

Дальше изучай