Перейти к основному содержимому

Тренировка алгоритмического мышления

Разработчику Аналитику Тестировщику
Архитектору Инженеру


Тренировка алгоритмического мышления​

Play ITЗагрузка интерактивного демо…

Мы разобрали теорию того, как работает алгоритм. Теперь давайте тренироваться, и изучать на основе примерах из реальной жизни. Это должно показать нам, как на самом деле выглядят алгоритмы в программировании.

Повторите для себя:

  • что такое алгоритм;
  • линейный и нелинейный алгоритм;
  • причинно-следственную связь;
  • события;
  • условия;
  • действия.

Основная мысль заключается в том, что можно проецировать объекты в системах реального мира на цифровой лад, и воссоздавать приближенные к реальности алгоритмы и процессы, используя те же сущности, но в виртуальной среде.

Давайте посмотрим.


Базовые линейные сценарии​

Линейный алгоритм представляет собой последовательность шагов, где каждый следующий шаг выполняется строго после предыдущего. Нет условий, нет ветвлений, только чёткий порядок действий от начала до конца. Такие алгоритмы часто лежат в основе простых бытовых процессов и базовых операций в коде.

1. Приготовление бутерброда

  • Событие: Человек решил перекусить.
  • Условие — На столе есть хлеб, колбаса, нож и тарелка.
  • Действие: Взять кусок хлеба → Положить на тарелку → Нарезать колбасу → Выложить ломтики на хлеб → Подать к столу.

2. Переливание жидкости из стакана в чашку

  • Событие: Жажда или необходимость переноса жидкости.
  • Условие — Стакан наполнен, чашка пуста, между ними свободное пространство.
  • Действие: Взять стакан → Наклонить его над чашкой → Дождаться полного переливания → Поставить пустой стакан обратно.

3. Включение компьютера

  • Событие: Пользователь нажал кнопку питания.
  • Условие: Компьютер подключён к сети, кнопка исправна.
  • Действие: Нажать кнопку → Система подаст сигнал на материнскую плату → Запустится процесс загрузки BIOS → Загрузится операционная система → Появится рабочий стол.

4. Отправка сообщения по электронной почте

  • Событие: Автор написал текст письма.
  • Условие: Адрес получателя указан верно, подключение к интернету стабильно.
  • Действие: Открыть почтовый клиент → Ввести адрес получателя → Вставить текст → Нажать кнопку "Отправить" → Получить уведомление об успешной отправке.

5. Покупка билета в кино

  • Событие: Посетитель подошёл к кассе.
  • Условие: У посетителя есть деньги, сеанс не продан полностью.
  • Действие: Назвать название фильма и время сеанса → Передать деньги кассиру → Получить билет → Зайти в зал.

6. Запись рецепта в книгу

  • Событие: Повар придумал новое блюдо.
  • Условие: Книга открыта, ручка под рукой.
  • Действие: Открыть новую страницу → Написать название блюда → Перечислить ингредиенты → Описать шаги приготовления → Закрыть книгу.

7. Сбор урожая овощей

  • Событие: Сезон сбора урожая наступил.
  • Условие: Овощи созрели, корзина готова.
  • Действие: Пройти по грядкам → Аккуратно сорвать овощи → Положить их в корзину → Перенести корзину в хранилище.

8. Уборка рабочего стола

  • Событие: Конец рабочего дня.
  • Условие — На столе лежат бумаги, кружка, ручки.
  • Действие: Собрать бумаги в стопку → Вынести мусор → Поставить кружку в раковину → Сложить ручки в органайзер → Выключить монитор.

9. Чтение книги

  • Событие: Читатель взял книгу в руки.
  • Условие: Книга доступна для чтения, свет включён.
  • Действие: Открыть первую страницу → Читать строки слева направо → Переворачивать страницу → Дойти до последней страницы → Закрыть книгу.

10. Подготовка к выходу на улицу

  • Событие: Пора выходить.
  • Условие: Одежда выбрана, обувь найдена.
  • Действие: Надеть одежду → Обуться → Взять ключи и сумку → Открыть дверь → Выйти на улицу.

Линейные процессы с проверкой данных​

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

11. Проверка возраста для доступа к сайту

  • Событие: Пользователь заполнил форму регистрации.
  • Условие: В поле "Возраст" введено число.
  • Действие: Ввести значение → Сравнить число с пороговым значением (например, 18) → Если число больше или равно порогу → Разрешить доступ → Иначе → Показать сообщение о запрете.

12. Расчёт сдачи в магазине

  • Событие: Покупатель отдал деньги за товар.
  • Условие: Сумма денег больше или равна стоимости товара.
  • Действие: Назвать стоимость товара → Принять сумму от покупателя → Вычесть стоимость из суммы → Вернуть остаток покупателю.

13. Регистрация нового пользователя в системе

  • Событие: Пользователь заполнил анкету.
  • Условие: Все обязательные поля заполнены, пароль соответствует требованиям сложности.
  • Действие: Проверить заполнение полей → Проверить сложность пароля → Создать учётную запись → Сохранить данные в базу → Отправить приветственное письмо.

14. Проверка наличия товара на складе

  • Событие: Поступил заказ от клиента.
  • Условие: Код товара указан в заказе.
  • Действие: Найти товар по коду → Проверить количество на складе → Если количество больше нуля → Резервировать товар → Если количество равно нулю → Сообщить об отсутствии.

15. Подтверждение оплаты счета

  • Событие: Клиент оплатил счет через банк.
  • Условие: Номер счета верен, сумма поступила.
  • Действие: Получить подтверждение от банка → Сверить номер счета → Сверить сумму → Обновить статус счета в системе → Отправить квитанцию клиенту.

16. Обработка возврата товара

  • Событие: Клиент принёс товар обратно.
  • Условие: Товар сохранён, чек присутствует.
  • Действие: Проверить целостность упаковки → Сверить товар с чеком → Проверить сроки возврата → Вернуть деньги → Оформить акт возврата.

17. Создание резервной копии файла

  • Событие: Пользователь запустил программу бэкапа.
  • Условие: Файл существует, место на диске свободно.
  • Действие: Найти файл → Скопировать его содержимое → Сохранить в папку резервных копий → Обновить лог операции.

18. Фильтрация списка контактов

  • Событие: Администратор запросил список активных пользователей.
  • Условие: База данных содержит записи с полями "Статус".
  • Действие: Прочитать все записи → Проверить поле "Статус" → Если статус "Активен" → Добавить в новый список → Если статус "Заблокирован" → Пропустить → Сохранить новый список.

19. Автоматическое продление подписки

  • Событие: Наступила дата окончания подписки.
  • Условие: Способ оплаты активен, баланс достаточен.
  • Действие: Проверить дату → Проверить способ оплаты → Списать средства → Продлить срок действия подписки → Отправить уведомление.

20. Валидация формы входа

  • Событие: Пользователь ввёл логин и пароль.
  • Условие: Логин и пароль не пусты.
  • Действие: Проверить наличие логина → Проверить наличие пароля → Запросить у базы данных совпадение → Если совпадение найдено → Войти в систему → Если совпадение не найдено → Показать ошибку.

Алгоритмы с разветвлением (нелинейные)​

Нелинейные алгоритмы содержат условия, которые направляют выполнение процесса по разным путям. Это дерево решений, где каждый узел — это проверка условия, а ветви — возможные варианты развития событий.

21. Выбор маршрута в навигаторе

  • Событие: Пользователь ввёл пункт назначения.
  • Условие — Доступны разные типы дорог (быстрая, короткая, платная).
  • Действие: Проанализировать пробки → Сравнить время проезда по разным маршрутам → Если маршрут А быстрее → Выбрать маршрут А → Иначе если маршрут Б короче → Выбрать маршрут Б → Иначе выбрать маршрут В.

22. Определение статуса заказа

  • Событие: Менеджер проверяет статус заказа.
  • Условие — Заказ имеет атрибуты "Дата", "Статус", "Способ доставки".
  • Действие: Проверить текущую дату → Если дата позже ожидаемой → Статус "Просрочен" → Если дата раньше ожидаемой → Статус "В пути" → Если дата совпадает → Статус "Готов к выдаче".

23. Классификация клиентов

  • Событие: Система анализирует покупки клиента.
  • Условие: Есть история покупок и общая сумма трат.
  • Действие: Посчитать сумму всех покупок за год → Если сумма больше 100 000 рублей → Присвоить статус "VIP" → Если сумма от 50 000 до 100 000 → Присвоить статус "Премиум" → Иначе присвоить статус "Стандарт".

24. Обработка ошибки при печати

  • Событие: Пользователь нажал кнопку "Печать".
  • Условие — Принтер подключён, есть бумага, уровень чернил.
  • Действие: Проверить подключение принтера → Если не подключён → Показать ошибку "Нет соединения" → Если подключён → Проверить наличие бумаги → Если нет бумаги → Показать ошибку "Нет бумаги" → Если бумага есть → Проверить уровень чернил → Если низкий → Показать предупреждение → Если всё ок → Начать печать.

25. Выбор тарифного плана

  • Событие: Клиент выбирает тариф.
  • Условие: Потребности в трафике и звонках.
  • Действие: Запросить объем необходимых гигабайт → Запросить количество минут → Если нужны большие объемы → Предложить тариф "Максимум" → Если нужны только звонки → Предложить тариф "Звонки" → Иначе предложить тариф "Базовый".

26. Система рекомендаций товаров

  • Событие: Пользователь просматривает категорию "Спорт".
  • Условие: История просмотров пользователя.
  • Действие: Анализировать историю → Если пользователь смотрел кроссовки → Показать рекламу носков → Если пользователь смотрел велосипеды → Показать защиту для шлема → Если ничего не найдено → Показать популярные товары категории.

27. Обработка возврата средств

  • Событие: Банк получил запрос на возврат.
  • Условие: Срок возврата не истёк, сумма корректна.
  • Действие: Проверить срок → Если срок истёк → Отказать в возврате → Если срок не истёк → Проверить сумму → Если сумма превышает лимит → Запросить одобрение руководителя → Если лимит не превышен → Одобрить возврат.

28. Управление доступом к ресурсам

  • Событие: Сотрудник пытается войти в систему.
  • Условие: У сотрудника есть права доступа.
  • Действие: Проверить роль сотрудника → Если роль "Администратор" → Открыть все разделы → Если роль "Менеджер" → Открыть разделы управления → Если роль "Сотрудник" → Открыть только личные данные → Иначе → Отказать в доступе.

29. Логика работы умного дома

  • Событие: Датчик движения зафиксировал активность.
  • Условие: Время суток, состояние системы безопасности.
  • Действие: Проверить время → Если ночь → Включить свет в коридоре → Если день → Не включать свет → Проверить режим охраны → Если включён → Отправить тревожное оповещение → Если выключен → Игнорировать событие.

30. Определение типа ошибки в программе

  • Событие: Программа завершилась с ошибкой.
  • Условие: Тип исключения, код ошибки.
  • Действие: Считать код ошибки → Если код 404 → Сообщение "Ресурс не найден" → Если код 500 → Сообщение "Ошибка сервера" → Если код 403 → Сообщение "Доступ запрещён" → Иначе → Показать общий код ошибки.

Сложные бизнес-процессы​

Эти алгоритмы объединяют множество условий, циклов и этапов, характерных для реальных бизнес-процессов. Они требуют тщательного проектирования и учёта множества переменных.

31. Процесс обработки заказа в интернет-магазине

  • Событие: Клиент нажал кнопку "Оформить заказ".
  • Условие: Корзина не пуста, аккаунт создан.
  • Действие: Проверить наличие товаров на складе → Если товары есть → Сформировать счёт → Отправить клиенту → Если товаров нет → Уведомить о дефиците → После оплаты → Проверить оплату → Если оплата прошла → Передать заказ в складской отдел → Если оплата не прошла → Вернуть заказ в корзину → Складской отдел формирует упаковку → Курьер забирает заказ → Доставляет клиенту → Получает подпись → Закрывает заказ.

32. Система кредитования в банке

  • Событие: Клиент подал заявку на кредит.
  • Условие — Данные клиента, кредитная история, доход.
  • Действие: Запросить кредитную историю → Оценить риск → Если риск низкий → Рассчитать ставку → Если риск средний → Повысить ставку → Если риск высокий → Отказать → Рассчитать ежемесячный платеж → Предложить условия клиенту → Если клиент согласен → Подписать договор → Выдать деньги → Начать начисление процентов.

33. Процесс найма сотрудников

  • Событие: Отдел кадров получил резюме.
  • Условие: Резюме соответствует вакансии.
  • Действие: Провести первичный скрининг → Если резюме подходит → Назначить собеседование → Провести собеседование → Оценить навыки → Если оценка положительная → Проверить рекомендации → Если рекомендации хорошие → Сделать предложение о работе → Если предложение принято → Оформить документы → Ввести в курс дела.

34. Управление запасами на складе

  • Событие: Ежедневная проверка остатков.
  • Условие: Текущие остатки ниже минимального уровня.
  • Действие: Сравнить текущий остаток с минимальным → Если остаток ниже → Создать заявку на закупку → Отправить заявку поставщику → Дождаться поставки → Принять товар → Обновить учетную запись → Если остаток выше → Не предпринимать действий.

35. Система поддержки клиентов

  • Событие: Клиент оставил заявку в чате.
  • Условие: Тема обращения, срочность.
  • Действие: Классифицировать тему → Если тема техническая → Перенаправить в техподдержку → Если тема финансовая → Перенаправить в бухгалтерию → Если тема срочная → Позвонить клиенту сразу → Если не срочная → Ответить в течение 24 часов → Решить проблему → Закрыть заявку.

36. Процесс обновления программного обеспечения

  • Событие: Система проверяет наличие обновлений.
  • Условие: Подключение к интернету, версия ПО.
  • Действие: Проверить версию текущего ПО → Если есть новая версия → Скачать обновление → Проверить целостность файла → Остановить работу программы → Установить обновление → Перезапустить программу → Проверить работоспособность → Если ошибка → Откатить изменения → Если успех → Сообщить пользователю.

37. Маркетинговая кампания

  • Событие: Планирование рекламной акции.
  • Условие — Целевая аудитория, бюджет, каналы продвижения.
  • Действие: Определить целевую аудиторию → Выбрать каналы продвижения → Разработать контент → Запустить рекламу → Мониторить эффективность → Если кликов мало → Изменить креатив → Если конверсия высокая → Увеличить бюджет → Если конверсия низкая → Прекратить кампанию → Подвести итоги.

38. Обучение новых сотрудников

  • Событие: Новичок приступил к работе.
  • Условие: Наличие наставника, учебные материалы.
  • Действие: Провести инструктаж по технике безопасности → Выдать доступы к системам → Назначить наставника → Провести вводный тренинг → Дать первые задачи → Проверить выполнение → Корректировать обучение → После успешного прохождения испытательного срока → Официально принять на работу.

39. Процесс аудита безопасности

  • Событие: Начало ежегодного аудита.
  • Условие: Наличие доступа к системам, план аудита.
  • Действие: Составить список систем для проверки → Проверить настройки доступа → Сканировать на уязвимости → Проверить логи → Составить отчет о нарушениях → Предложить меры по устранению → Проверить выполнение мер → Закрыть аудит.

40. Разработка продукта

  • Событие: Идея продукта утверждена.
  • Условие: Команда разработчиков, ресурсы.
  • Действие: Создать прототип → Протестировать прототип → Собрать обратную связь → Внести изменения → Разработать MVP → Провести бета-тестирование → Исправить ошибки → Запустить релиз → Мониторить использование → Планировать следующие версии.

Алгоритмы с циклами и повторениями​

Циклические алгоритмы подразумевают многократное выполнение одного и того же блока действий до выполнения определённого условия. Это основа автоматизации рутинных задач.

41. Подсчет суммы чисел в диапазоне

  • Событие: Нужно найти сумму чисел от 1 до 100.
  • Условие: Текущее число меньше или равно 100.
  • Действие: Инициализировать сумму нулем → Инициализировать счетчик единицей → Пока счетчик меньше или равен 100 → Прибавить счетчик к сумме → Увеличить счетчик на единицу → Когда условие нарушено → Вывести итоговую сумму.

42. Поиск максимального элемента в списке

  • Событие: Есть список чисел.
  • Условие: Есть ещё не проверенные элементы.
  • Действие: Взять первый элемент как максимум → Пройти по всем остальным элементам → Если текущий элемент больше максимума → Заменить максимум на текущий элемент → Когда список закончен → Вывести максимальное значение.

43. Проверка пароля с ограничением попыток

  • Событие: Пользователь вводит пароль.
  • Условие: Количество попыток меньше пяти.
  • Действие: Попросить ввести пароль → Проверить правильность → Если пароль верный → Войти в систему → Если пароль неверный → Увеличить счетчик ошибок → Если счетчик достиг пяти → Заблокировать учетную запись → Иначе → Попросить ввести пароль снова.

44. Генерация таблицы умножения

  • Событие: Нужно вывести таблицу умножения на 5.
  • Условие: Множитель меньше или равен 10.
  • Действие: Инициализировать множитель единицей → Пока множитель меньше или равен 10 → Умножить 5 на множитель → Вывести результат → Увеличить множитель → Когда условие нарушено → Закончить.

45. Обход всех файлов в папке

  • Событие: Нужно обработать все файлы в директории.
  • Условие: Есть необработанные файлы.
  • Действие: Найти первый файл → Если файл существует → Обработать файл (например, скопировать) → Перейти к следующему файлу → Когда файлы закончились → Завершить операцию.

46. Поиск слова в тексте

  • Событие: Нужно найти слово "алгоритм" в книге.
  • Условие: Есть ещё неоткрытые страницы.
  • Действие: Открыть первую страницу → Прочитать строки → Если найдено слово → Запомнить позицию → Перейти к следующей странице → Когда страницы закончились → Вывести все найденные позиции.

47. Сортировка списка методом пузырька

  • Событие: Есть неупорядоченный список чисел.
  • Условие: Есть соседние элементы, которые нужно поменять местами.
  • Действие: Пройти по списку → Сравнить соседние элементы → Если левый больше правого → Поменять их местами → Повторить проход по списку → Пока за один проход не было обменом элементов → Список отсортирован.

48. Мониторинг температуры сервера

  • Событие: Каждую минуту нужно проверять температуру.
  • Условие: Сервер работает.
  • Действие: Подождать одну минуту → Прочитать датчик температуры → Если температура выше нормы → Включить вентиляторы → Если температура критическая → Отправить тревожное сообщение → Вернуться к началу цикла.

49. Автоматическое создание резервных копий

  • Событие: Наступило время создания копии.
  • Условие: Есть новые файлы с момента последней копии.
  • Действие: Проверить время последнего бэкапа → Найти все изменённые файлы → Скопировать их в архив → Обновить метку времени последнего бэкапа → Вернуться к ожиданию следующего раза.

50. Оптимизация нагрузки на сервер

  • Событие: Нагрузка на сервер выросла.
  • Условие: Количество запросов превышает порог.
  • Действие: Подсчитать количество запросов → Если количество больше порога → Добавить дополнительный сервер → Перераспределить нагрузку → Если количество упало ниже порога → Удалить лишний сервер → Вернуться к мониторингу.

Игры и выигрышные стратегии​

Этап 27. Краткий обзор — раздел 21 «Базовой информатики».

В олимпиадных и экзаменационных задачах часто спрашивают не код, а кто выигрывает при оптимальной игре. Полезные приёмы:

ПриёмКак применять
Перебор вариантовДля малой доски перебрать все ходы (дерево неглубокое)
Дерево решенийКорень — позиция; ветви — ходы; листья — победа/поражение
ИнвариантНайти величину, которую вы контролируете после каждого своего хода
СимметрияПовторять ход соперника зеркально — нейтрализовать его преимущество
ЧётностьПобеда по чётному/нечётному числу ходов или по чётности суммы
Анализ с концаОт финальной позиции («кто взял последний») назад к старту

Пример (инвариант). Игра: 21 камень, за ход можно взять 1, 2 или 3; проигрывает взявший последний. Выигрышная стратегия первого: после каждого своего хода оставлять число камней, кратное 4 (21 → 17 → 13 → 9 → 5 → 1). Соперник за ход меняет остаток на 1–3, кратность 4 восстановить не может.

Пример (чётность). Две кучи по n камней; за ход — взять любое число из одной кучи. Инвариант «равные кучи»: если соперник нарушил равенство, выравниваете своим ходом — выигрываете при правильном старте.


Когда "простой" перебор не подходит​

Задача коммивояжёра — найти кратчайший маршрут по всем городам ровно один раз и вернуться в начало. Наивный перебор всех маршрутов даёт факториальную сложность O(n!): при 20 городах перебор уже нереалистичен. Такие задачи иллюстрируют, зачем нужны оценка сложности, графовые алгоритмы и приближённые решения вместо точного перебора.

Выбор алгоритма всегда начинается с вопроса: какой размер входа и какой допустимый срок? Таблица роста — в линейной, квадратичной и логарифмической сложности.

Когда логика "событие → условие → действие" уже понятна, переходите к коду — сначала оцените, уложится ли решение по времени (Lab / Big-O — 1128), затем Lab / 1122 на Python, Lab / 1131 на Java или Lab / 1140 на Pascal — там те же шаги (цикл, перебор, условия), но в формате задач ЕГЭ и олимпиад с примерами входа и выхода.