📘 CodingMarble Learn

Методы разработки алгоритмов

Чтобы создать алгоритм, сначала опишите задачу: входные данные, нужный результат и условия. Затем запишите чёткие конечные шаги словами, списком, псевдокодом или блок-схемой. Большую задачу делят сверху вниз на маленькие части (пошаговая детализация) или собирают снизу вверх из небольших проверенных кусочков. Классические приёмы: перебор (пробуем всё), разделяй и властвуй (делим, решаем, объединяем; деление пополам, как в бинарном поиске и сортировке слиянием), жадный метод (каждый раз берём самый выгодный на вид вариант; быстро, но не всегда оптимально), динамическое программирование (каждую маленькую подзадачу решаем один раз и храним в таблице) и поиск с возвратом (делаем выбор, а в тупике отменяем его). Приём и структуры данных (массивы, стеки, двоичные деревья) выбирают, проверяя правильность и эффективность (временную сложность).

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

  1. Сначала опишем задачу. Вход: 8 чисел. Выход: самое большое. Шаги: смотрим каждую коробку и помним самое большое из увиденных.
  2. Разделяй и властвуй: чтобы найти число от 1 до 16, спросите про середину и отбросьте половину. Хватит 4 вопросов.
  3. Жадный метод: всегда берём самую крупную монету, которая подходит. Это быстро, но для суммы 6 и монет 1, 3, 4 выйдет 3 монеты, а не лучшие 2.
  4. Динамическое программирование: сначала решаем малые суммы и записываем каждый ответ в таблицу. Таблица находит 6 = 3 + 3.
  5. Поиск с возвратом: идём по пути; в тупике возвращаемся к последнему выбору и пробуем другой путь, пока не дойдём до выхода.
  6. Теперь ваш ход: выберите сумму и монеты. Угадайте: даёт ли жадный метод наименьшее число монет? Сравните с DP.

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

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

Зачем писать вход и выход до программирования?

Если вы точно не знаете, что поступает и что должно получиться, вы не сможете проверить, верны ли шаги.

Как 4 вопросов хватает для 16 чисел?

Каждый ответ отбрасывает половину: 16, 8, 4, 2, 1. Серые коробки показывают отброшенную половину.

Если жадный метод может ошибаться, зачем его использовать?

Он очень быстрый и простой, а для многих задач (обычные монеты, занятия с самым ранним окончанием) его правильность доказана.

Чем DP отличается от простого перебора всего?

Он решает каждую малую сумму один раз и использует результат повторно, поэтому таблица растёт шаг за шагом, а не перебирает все комбинации.

Начинает ли поиск с возвратом всё заново с самого начала?

Нет. Он возвращается лишь до последней развилки, где остался непроверенный путь, и продолжает оттуда.

Как узнать, работает ли жадный метод для моих монет?

Сравните его с DP на многих суммах. Попробуйте монеты 1, 7, 10 в свободной игре.

Постановка задачи: вход, выход и шаги

Прежде чем писать код, точно опишите задачу. Это называется спецификация.

Запись шагов

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

Проверьте алгоритм вручную на маленьких данных, в том числе на подвохах (все числа равны, отрицательные числа, всего одно число).

Проектирование сверху вниз и снизу вверх

Сверху вниз (пошаговая детализация): берём всю задачу, делим на несколько крупных шагов, потом каждый шаг делим снова, пока каждую часть не станет легко запрограммировать. Пример: «Сделать табель» → прочитать оценки → посчитать средние → поставить итоговые оценки → напечатать.

Снизу вверх: сначала пишем и проверяем маленькие повторно используемые кусочки (функцию поиска максимума, функцию сортировки), затем соединяем их в целую программу.

В реальных проектах используют оба способа: планируют сверху вниз, а пишут и проверяют снизу вверх.

Разделяй и властвуй и метод деления пополам

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

Жадные алгоритмы

Жадный алгоритм делает выбор, который сейчас выглядит лучшим, и никогда его не меняет.

Но жадный метод не всегда верен: с монетами 1, 3, 4 сумма 6 жадно выдаётся как 4 + 1 + 1 (3 монеты), а 3 + 3 — всего 2. Чтобы доверять жадному методу, его нужно доказать или сравнить с надёжным методом.

Динамическое программирование и поиск с возвратом

Динамическое программирование (DP)

Если одни и те же маленькие задачи повторяются, решаем каждую один раз и храним ответ в таблице. Наименьшее число монет для суммы a: best[a] = 1 + min(best[a - c]) по всем монетам c ≤ a, начиная с best[0] = 0. Для монет 1, 3, 4: best = 0, 1, 2, 1, 1, 2, 2. Заполнять таблицу от малого к большому — это снизу вверх; рекурсия с памятью — это сверху вниз (мемоизация). Подробнее смотрите в отдельном уроке о динамическом программировании.

Поиск с возвратом

Строим решение по одному выбору. Если выбор нарушает правило или ведёт в тупик, отменяем его и пробуем следующий вариант. Так решают лабиринты, судоку, задачу о N ферзях и перечисляют все подмножества. Это аккуратный перебор: он пропускает целые ветви, которые не могут подойти.

Перебор

Пробуем все возможные ответы. Всегда правильно, но часто слишком медленно (2ⁿ подмножеств, n! порядков).

Выбор приёма: правильность, эффективность и структуры данных

ПриёмКогда применятьПримерОбычное время
Переборданных совсем малоперебрать все пароли из 3 цифрчасто 2ⁿ или n!
Разделяй и властвуйчасти независимыбинарный поиск, сортировка слияниемO(log n), O(n log n)
Жадный методлучший локальный выбор доказанно безопасенвыбор занятий, сдачаO(n log n)
Динамическое программированиеподзадачи повторяютсяразмен монет, кратчайшие путиразмер таблицы
Поиск с возвратомпоиск по правиламлабиринт, судокуэкспоненциальное, но с отсечением

Обоснуйте выбор

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

Помогают структуры данных

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

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

  1. Сыграйте с другом в игру «угадай число от 1 до 100». Всегда спрашивайте про середину. Всегда ли можно выиграть за 7 вопросов? (2⁷ = 128.)
  2. Для монет 1, 3, 4 запишите на бумаге таблицу DP для сумм от 0 до 10. Где жадный метод ошибается?
  3. Откройте последний шаг 3D. Попробуйте монеты 1, 7, 10 и сумму 14. Жадный метод даёт 10 + 1 + 1 + 1 + 1; DP даёт 7 + 7.
  4. Запишите список шагов для задачи «найти наименьшее число в списке» и проверьте его на 5, 5, 5 и на одном числе.

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

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

1. Напишите спецификацию и список шагов для поиска наибольшего из n чисел.

Вход: n ≥ 1 чисел. Выход: наибольшее. Шаги: 1. best ← первое число. 2. Для каждого другого числа x: если x > best, то best ← x. 3. Вывести best. Для 4, 9, 2, 7, 12, 5, 10, 3 результат равен 12 после 7 сравнений.

2. Сколько вопросов нужно при делении пополам, чтобы найти число от 1 до 1000?

Каждый вопрос сокращает диапазон вдвое: 1000 → 500 → 250 → 125 → 63 → 32 → 16 → 8 → 4 → 2 → 1. Это 10 вопросов (2¹⁰ = 1024 ≥ 1000).

3. Выдайте 87 жадным способом монетами 50, 20, 10, 5, 2, 1.

50 (осталось 37), 20 (17), 10 (7), 5 (2), 2 (0): 50 + 20 + 10 + 5 + 2 = 5 монет.

4. Заполните таблицу DP для монет 1, 3, 4 до суммы 7.

best[0]=0, [1]=1, [2]=2, [3]=1, [4]=1, [5]=min(best4, best2, best1)+1=2, [6]=min(best5, best3, best2)+1=2, [7]=min(best6, best4, best3)+1=2 (3 + 4).

5. Занятия (начало-конец): A 9-11, B 10-12, C 11-13, D 12-14, E 13-15. Выберите наибольшее число занятий, которые не пересекаются.

Жадно по самому раннему окончанию: A (кончается в 11), затем C (начало 11, конец 13), затем E (начало 13). Всего 3 занятия: A, C, E.

6. Спланируйте сверху вниз программу, которая сообщает классу средний балл и лучшего ученика.

Уровень 1: прочитать данные → вычислить → напечатать. Уровень 2: прочитать имена и оценки в списки; найти сумму и среднее; найти максимальную оценку и имя; напечатать оба результата. Затем каждую часть программируют и проверяют снизу вверх.

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

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

1. В спецификации задачи должны быть указаны:
2. Бинарному поиску в 16 отсортированных элементах нужно не больше примерно:
3. Какой приём всегда берёт вариант, который сейчас выглядит лучшим?
4. Динамическое программирование хорошо работает, когда:
5. В лабиринте возвращение к последней развилке после тупика — это:

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

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

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

Какие основные методы разработки алгоритмов существуют?

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

Чем жадный метод отличается от динамического программирования?

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

Что такое проектирование сверху вниз и снизу вверх?

Сверху вниз делит всю задачу на более мелкие шаги; снизу вверх сначала строит и проверяет малые части, а затем соединяет их. Большинство программ используют оба способа.

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

PolandSzkoła podstawowa, klasa VIIUnderstanding, analysing and solving problems
PolandSzkoła podstawowa, klasa VIIIUnderstanding, analysing and solving problems
PolandLiceum ogólnokształcące, klasa IUnderstanding, analysing and solving problems
China高三Electives (选修)

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

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

Похожие уроки

Все уроки: Computer Science