Глава 2. Алгоритмы и элементы программирования
Представьте: вы открываете TikTok, и первое видео в ленте — именно то, что вас зацепит. Случайность? Нет. За этим стоит алгоритм. Или вот вы играете в Minecraft — каждый мир генерируется по определённым правилам. Это тоже алгоритм. В этой главе разберёмся, как они устроены и почему одни работают быстрее других.
§ 5. Основные сведения об алгоритмах
Алгоритм — это не просто список действий, а строгая последовательность, которая при одинаковых входных данных всегда даёт одинаковый результат. Компьютеру нужна абсолютная чёткость — он не понимает «приблизительно» или «как-нибудь».
💡 Определение
Алгоритм — это конечная система правил, определяющая последовательность действий над исходными данными для получения результата. Он обладает свойствами: дискретности, детерминированности, понятности, результативности, конечности и массовости.
5.1. Что такое алгоритм? Свойства алгоритма
Вы каждый день используете алгоритмы: утренняя рутина (проснулся → выключил будильник → почистил зубы), поиск информации в Google, заказ пиццы через приложение. Но для компьютера нужна особая точность.
Пять ключевых свойств, которые делают последовательность действий алгоритмом
Пять ключевых свойств алгоритма
Давайте разберём их на примере заказа пиццы через приложение.
📋 Дискретность (пошаговость)
Алгоритм разбит на отдельные шаги: открыть приложение → выбрать пиццу → указать адрес → оплатить. Нельзя «размазать» действия — каждый шаг выполняется по очереди.
🎯 Детерминированность (однозначность)
Если вы 10 раз повторите одни и те же действия (выбор пиццы «Маргарита», адрес «ул. Пушкина, 10»), результат будет одинаковым — заказ оформится. Никакой неопределённости.
✅ Понятность
Каждая команда понятна исполнителю. Для человека: «Нажми на кнопку "Оплатить"». Для компьютера: button.click(). Но если написать «Сделай что-нибудь красивое» — это не алгоритм, потому что непонятно, что делать.
⏱️ Результативность (конечность)
Алгоритм завершится за конечное число шагов. Заказ будет оформлен (или выдана ошибка «Введите корректный адрес»). Если программа зависла в бесконечном цикле — это нарушение результативности.
🌐 Массовость
Алгоритм работает не для одной конкретной пиццы, а для любого заказа: пицца, роллы, бургеры. Это универсальность.
⚠️ Когда что-то НЕ является алгоритмом?
Пример из учебника: Построение перпендикуляра к прямой с помощью циркуля.
Инструкция:
- Отложить от точки A на прямой MN циркулем отрезки равной длины.
- Увеличить раствор циркуля до радиуса, в полтора-два раза больше.
- Провести дуги окружностей...
Проблема: Шаг 2 неоднозначен. «Полтора-два раза» — это сколько? 1,5? 1,7? 2? Для компьютера это катастрофа. Нарушено свойство понятности.
Как исправить? Указать точное значение: «Увеличить раствор циркуля в 1,5 раза относительно длины AB».
Когда инструкции неоднозначны, исполнитель теряется
🔍 Исполнитель алгоритма
Исполнитель — это субъект или устройство, способные правильно интерпретировать описание алгоритма и выполнить содержащийся в нём перечень действий.
Исполнители бывают двух типов:
- Формальные («неразмышляющие») — строго следуют инструкциям без творчества (компьютеры, роботы)
- Неформальные — могут принимать решения и интерпретировать команды (люди)
5.2. Способы записи алгоритма
Алгоритм можно записать по-разному — в зависимости от того, кто его будет выполнять. Рассмотрим основные способы.
📝 Словесная запись
Запись на естественном языке.
Пример: Алгоритм «Найти максимальное число из трёх».
1. Ввести три числа: a, b, c.
2. Если a > b и a > c, то максимум = a.
3. Иначе, если b > c, то максимум = b.
4. Иначе максимум = c.
5. Вывести максимум.
Плюсы: Понятно человеку.
Минусы: Не подходит для компьютера.
📊 Блок-схема
Визуальное представление алгоритма с использованием стандартных символов (ГОСТ 19.701-90).
| Овал | Начало/Конец |
| Параллелограмм | Ввод/Вывод |
| Прямоугольник | Процесс |
| Ромб | Условие |
Визуальное представление последовательности действий помогает понять логику
💬 Псевдокод
Гибрид естественного языка и программирования. Используется для быстрой записи идеи алгоритма.
Пример: Поиск простых чисел (Решето Эратосфена).
Алгоритм: Найти все простые числа от 2 до n
1. Создать список чисел от 2 до n
2. p := 2
3. Зачеркнуть все числа, кратные p (2p, 3p, 4p, ...)
4. Найти следующее незачёркнутое число > p
5. Присвоить p это число
6. Повторять шаги 3-5, пока p² ≤ n
7. Оставшиеся незачёркнутые числа — простые
Оптимизация: Можно начинать зачёркивать с p², а не с 2p, потому что все меньшие составные числа уже будут зачёркнуты.
Метод «просеивания» чисел для поиска простых
📚 Решето Эратосфена: поиск простых чисел
Простые числа — это натуральные числа, большие единицы, которые имеют только два делителя: единицу и само это число (например: 2, 3, 5, 7, 11, 13...).
Метод нахождения простых чисел в интервале [2; n] предложил греческий математик Эратосфен (275–194 гг. до н. э.). По одной из версий, он выписал все числа от 2 до 10 000 на папирусе, натянутом на рамку, и прокалывал составные числа. Папирус стал подобен решету, которое «просеивало» составные числа, а простые оставляло.
Интересный факт: В 2013 г. открыто простое число, запись которого в десятичной системе счисления состоит из 17 425 170 знаков. На проверку простоты нового числа ушло 39 дней работы персонального компьютера в Университете Центрального Миссури, США.
Метод половинного деления
Вспомним детскую игру «Угадай-ка». Первый игрок задумывает целое число из диапазона, второй должен его угадать, задавая вопросы «больше или меньше?»
Сужение диапазона поиска вдвое на каждом шаге
🎮 Как работает алгоритм
Пусть задумано число X ∈ [A, B].
1. C := (A + B) div 2 // Находим середину
2. Если X = C, то число угадано
3. Если X < C, то B := C - 1 // Сдвигаем правую границу
4. Если X > C, то A := C + 1 // Сдвигаем левую границу
5. Повторяем с шага 1
Почему это эффективно? За каждый шаг диапазон сокращается вдвое. Для чисел от 0 до 100 понадобится максимум 7 попыток (log₂(100) ≈ 6.64).
5.3. Сложность алгоритма: Почему это важно?
Представьте два навигатора: первый предлагает маршрут за 1 секунду, но дорога занимает 2 часа. Второй думает 10 секунд, но находит путь за 1 час. Какой лучше? Так же и с алгоритмами — важна не только корректность, но и скорость работы.
Разные пути к одной цели: какой эффективнее?
💡 Определения
Вычислительный процесс, порождённый алгоритмом — это последовательность шагов алгоритма, пройденных при его исполнении.
Сложность алгоритма — количество элементарных шагов (действий) в вычислительном процессе этого алгоритма.
Важно: Речь идёт именно о вычислительном процессе, а не о самом алгоритме. В циклических алгоритмах за счёт повторного выполнения одних и тех же команд число шагов может быть значительно больше числа команд.
📊 Типы сложности
Сложность обычно выражают как функцию от размера входных данных n.
| Сложность | Обозначение | Пример |
|---|---|---|
| Константная | O(1) |
Получить первый элемент массива |
| Линейная | O(n) |
Найти число в несортированном списке |
| Логарифмическая | O(log n) |
Бинарный поиск (метод половинного деления) |
| Квадратичная | O(n²) |
Сортировка пузырьком |
Чем круче склон, тем быстрее растёт сложность при увеличении данных
🎯 Практический пример
Вы хотите найти песню в плейлисте из 1000 треков.
- Линейный поиск (перебор всех треков): до 1000 операций
- Бинарный поиск (если список отсортирован): ≈ 10 операций
Разница в 100 раз! Вот почему Spotify или YouTube Music мгновенно подбирают рекомендации.
Метод быстрого возведения в степень
Известно, что во многих языках программирования нет операции возведения в степень, и такой алгоритм программисту надо писать самостоятельно. С ростом показателя степени растёт количество операций умножения. Следовательно, актуален вопрос о создании эффективного алгоритма.
Два подхода к построению башни: последовательный и с удвоением
🏛️ Метод из Древней Индии
Рассмотрим метод быстрого вычисления натуральной степени n вещественного числа x, описанный в Древней Индии ещё до нашей эры.
1. Запишем n в двоичной системе счисления.
2. Заменим в этой записи каждую единицу парой букв КХ,
а каждый ноль — буквой К.
3. Вычеркнем крайнюю левую пару КХ.
4. Полученная строка, читаемая слева направо, даёт правило
быстрого вычисления x^n, если:
- букву К рассматривать как операцию возведения
результата в квадрат
- букву X — как операцию умножения результата на х
Вначале результат равен х.
🔢 Пример: вычислим x100
1. 100 = 1100100₂
2. Строим последовательность: KXKXKKKXKK
3. Вычёркиваем крайнюю левую пару КХ: KXKKKXKK
4. Вычисляем искомое значение:
K: возвести x в квадрат → x²
X: умножить результат на x → x³
K: возвести результат в квадрат → x⁶
K: возвести результат в квадрат → x¹²
K: возвести результат в квадрат → x²⁴
X: умножить результат на x → x²⁵
K: возвести результат в квадрат → x⁵⁰
K: возвести результат в квадрат → x¹⁰⁰
Результат: Мы вычислили сотую степень числа x за 8 умножений. Это значительно эффективнее «прямолинейного» алгоритма возведения в степень, требующего 99 операций умножения.
💡 Почему это работает?
Это экспоненциальный выигрыш — чем больше степень, тем сильнее разница. Метод основан на двоичном представлении показателя степени и использует свойства степеней для минимизации количества операций.
🎓 Ключевые выводы
Подведём итоги изученного материала
🤔 Проверь себя
Проверьте, как хорошо вы усвоили материал!
Блок 1: Свойства алгоритмов
Почему кулинарный рецепт «Добавьте сахар по вкусу» не является алгоритмом?
Ответ: Нарушено свойство понятности и детерминированности. «По вкусу» — субъективная оценка. Два человека добавят разное количество сахара, а значит, результат будет неоднозначным. Алгоритм должен давать чёткие инструкции: «Добавьте 50 г сахара».
Задача: Исполнитель Робот может выполнять команды: (1) Шаг вперёд, (2) Повернуть направо на 90°. Сколько разных алгоритмов из 4 команд можно составить? Сколько из них приведут Робота в одну точку?
Ответ: Всего алгоритмов: 2⁴ = 16 (на каждом из 4 шагов — 2 варианта команды).
В одну точку вернутся те, где Робот сделает полный круг (4 поворота направо) или замкнёт квадрат. Нужно проверить все 16 вариантов — ответ зависит от начальной позиции.
Докажите, что метод Эратосфена (решето для поиска простых чисел) является алгоритмом.
Доказательство по свойствам:
- Дискретность: Алгоритм разбит на чёткие шаги (выписать числа, зачеркнуть кратные, найти следующее и т.д.)
- Детерминированность: Для одного и того же n всегда получим одинаковый набор простых чисел
- Понятность: Каждая команда однозначна («зачеркнуть числа, кратные p»)
- Результативность: Процесс завершается, когда p² > n
- Массовость: Работает для любого натурального n
Блок 2: Сложность алгоритмов
У вас есть отсортированный список из 1 000 000 студентов. Сколько максимум сравнений нужно, чтобы найти студента с фамилией «Смирнов» методом половинного деления?
Ответ: log₂(1 000 000) ≈ 20 сравнений. На каждом шаге список делится пополам.
Шаг 1: 1 000 000 → 500 000
Шаг 2: 500 000 → 250 000
Шаг 3: 250 000 → 125 000
...
Шаг 20: 2 → 1
Алгоритм сортировки пузырьком имеет сложность O(n²). Сколько операций он выполнит для списка из 10 000 элементов? А для 100 000?
Ответ:
- 10 000² = 100 000 000 (сто миллионов операций)
- 100 000² = 10 000 000 000 (десять миллиардов операций)
Вывод: При увеличении данных в 10 раз сложность растёт в 100 раз!
Подсчитайте, какое наибольшее число шагов может понадобиться для угадывания по алгоритму половинного деления числа X ∈ [0, 100].
Решение: log₂(101) ≈ 6.66, округляем вверх → 7 шагов.
Это максимум, когда загаданное число находится в самом конце процесса деления.
Блок 3: Мыслительный эксперимент
Кейс: Вы разрабатываете систему рекомендаций для музыкального стримингового сервиса. Алгоритм А перебирает все песни подряд O(n), алгоритм Б использует индексы и работает за O(log n). В базе 50 миллионов треков. Насколько быстрее работает алгоритм Б?
Расчёт:
- Алгоритм А: 50 000 000 операций
- Алгоритм Б: log₂(50 000 000) ≈ 26 операций
Разница почти в 2 миллиона раз! Вот почему Spotify или YouTube Music мгновенно подбирают рекомендации.
Постройте эффективный алгоритм возведения числа x в степень n = 152 методом быстрого возведения.
Решение:
1. 152 = 10011000₂
2. Строим: KXKKXKXKKKK
3. Удаляем КХ: KKXKXKKKK
4. Выполняем:
K: x²
K: x⁴
X: x⁵
K: x¹⁰
X: x¹¹
K: x²²
K: x⁴⁴
K: x⁸⁸
K: x¹⁷⁶... (ошибка, нужно пересчитать)
Правильный ответ требует внимательных вычислений, но метод сократит количество операций с 151 до ~10-12.
Эффективные алгоритмы делают поиск мгновенным даже в огромных базах данных
🎯 Практические задания
Попробуйте применить полученные знания на практике!
✍️ Задание 1: Свойства алгоритма
Переформулируйте описание способа проведения перпендикуляра к прямой в заданной точке (из примера 3 в учебнике) так, чтобы оно стало алгоритмом.
Подсказка: Замените неопределённые формулировки точными числовыми значениями.
⏱️ Задание 2: Песочные часы
Есть двое песочных часов: на 3 и на 8 минут. Для приготовления эликсира бессмертия его надо варить ровно 7 минут. Как это сделать?
Придумайте систему команд исполнителя Колдун. Запишите с их помощью план действий.
🔢 Задание 3: Исполнитель Автомат
Исполнитель Автомат получает на вход четырёхзначное число и преобразует его по алгоритму (см. задание 9 в учебнике).
Могут ли результатом работы быть числа: 1610, 1010, 1019? При обработке числа x автомат выдаёт 1418. Укажите наименьшее и наибольшее значения x.
📊 Задание 4: Подсчёт сложности
Подсчитайте сложность алгоритма перемножения двух натуральных чисел «столбиком» при условии, что одно из них состоит из n, а второе — из m десятичных цифр.
Подсказка: Учтите количество операций умножения однозначных чисел и сложений.