"Информатика", Семёнов А.Л., Рудченко Т.А.
Дерево перебора — схема, которая помогает без пропусков рассмотреть все возможные результаты последовательных выборов. От начального узла проводят ветви, а путь от корня до листа показывает один готовый вариант. Такой способ удобен, когда нужно перечислить сочетания или проверить, что ни один случай не потерян. Для подмножеств на каждом шаге решают, включать очередной элемент или нет; поэтому у множества из n элементов ровно 2ⁿ подмножеств.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Дерево перебора вариантов — схема, в которой выборы изображаются ветвями, а каждый путь от корня показывает один полный вариант. Оно помогает наглядно перечислить результаты, когда задача состоит из нескольких шагов. По схеме проще проверить, не пропущено ли какое-либо сочетание.
Узел дерева — точка, соответствующая исходному состоянию или результату очередного выбора; корень — начальный узел. Узел показывает, где мы находимся после некоторой последовательности действий. От корня начинается перебор, а от других узлов он продолжается.
Ветвь дерева — линия от одного узла к следующему, показывающая один возможный выбор на этом шаге. Например, ветви могут обозначать выбор чая или какао. Если из узла провести ветви для всех разрешённых вариантов, ни один выбор не потеряется.
Подмножество множества — множество, составленное из некоторых его элементов; к подмножествам относятся также пустое множество и само исходное множество. Например, для множества {А, Б} подмножеством будет {А}. Это понятие нужно, чтобы точно перечислять все группы, которые можно составить из исходных элементов.
Перебор начинают с корня: от него проводят ветви для всех возможных выборов на первом шаге. Корень обозначает начало, когда ещё не сделан ни один выбор. Если сразу рассмотреть каждый разрешённый вариант, дальше дерево сможет охватить все возможные продолжения.
Каждую ветвь продолжают, учитывая условие задачи и уже сделанные выборы. Это важно, потому что следующий выбор иногда зависит от предыдущего: некоторые продолжения могут быть запрещены или уже невозможны. Поэтому из каждого узла проводят не одинаковые ветви автоматически, а только те, которые подходят данному состоянию.
Когда все шаги выбора закончены, путь достигает листа — конечного узла, от которого перебор дальше не продолжается. Листья соответствуют завершённым вариантам, поэтому их можно перечислить или сосчитать. Если считать только листья, промежуточные состояния не будут ошибочно приняты за готовые ответы.
Для подмножеств выбирают элементы в определённом порядке, например сначала А, потом Б, затем В. На каждом уровне для очередного элемента проводят две ветви: включить его или не включать. Такой порядок позволяет построить все сочетания последовательно и не запутаться, какие элементы уже рассмотрены.
У каждого элемента два решения, и каждое решение продолжается всеми выборами для следующих элементов. Поэтому при добавлении очередного элемента каждый прежний путь раздваивается, а число листьев удваивается. Если элементов n, получится 2ⁿ подмножеств; пустое множество возникает, когда ни один элемент не включили.
| Свойство | Перебор вариантов | Перебор подмножеств |
|---|---|---|
| Что изображают ветви | Возможные выборы на очередном шаге | Включение элемента или отказ от него |
| Что означает путь от корня до листа | Один полный вариант | Одно подмножество |
| Условие завершения перебора | Выполнены все шаги, заданные условием | Рассмотрены все элементы множества |
| Число результатов для n шагов | Зависит от числа выборов на каждом шаге | 2ⁿ, если на каждом шаге два решения |
Сначала определи, что означает одна ветвь: обычный выбор по условию задачи или решение о включении элемента. Затем проверь, что путь до листа соответствует одному результату. Для подмножеств удобно проверить число листьев по правилу 2ⁿ.
Нужно выбрать напиток, а затем дополнение к нему. Каждый выбор напитка можно сочетать с каждым из двух дополнений. Поэтому строим дерево с двумя шагами: сначала напиток, потом еда.
Нарисуй корень и проведи от него две ветви: «чай» и «какао». Это все варианты первого выбора, потому что других напитков условие не предлагает. От каждой ветви нужно продолжить перебор.
От узла «чай» проведи ветви «булочка» и «яблоко». Такие же две ветви проведи от узла «какао». Одинаковые дополнения нужны у каждого напитка, так как условие не ограничивает сочетания.
Прочитай пути от корня до листьев, каждый раз записывая напиток и дополнение вместе. Получаются четыре пути, и каждый задаёт отдельный завтрак. Других листьев в дереве нет.
Ответ: чай с булочкой, чай с яблоком, какао с булочкой, какао с яблоком. Проверка: у двух напитков по два продолжения, значит, листьев 2 · 2 = 4. Каждое сочетание встречается один раз.
Для каждой буквы нужно отдельно решить, попадёт ли она в подмножество. Разберём элементы по порядку: сначала А, затем Б. При этом важно оставить возможность не выбрать ни одной буквы.
От корня проведи две ветви: включить А и не включать А. Они делят все будущие подмножества на две группы. В первой буква А есть, во второй её нет.
На каждой ветви реши, включать ли Б, и снова проведи два продолжения. Если Б включена вместе с А, получаем {А, Б}; если не включена — {А}. В ветке без А получаются {Б} и отсутствие обеих букв.
Ответ: ∅, {А}, {Б}, {А, Б}. Пустое множество ∅ означает, что не включили ни А, ни Б. Всего четыре результата, что совпадает с 2².
Теперь нужно принять решение для трёх букв. На каждом шаге вариантов два, поэтому дерево имеет три уровня решений. Чтобы не повторить результат, на всех путях рассматриваем буквы в одном порядке: А, Б, В.
Для А выбери «включить» или «не включать», а затем проделай то же для Б на каждой полученной ветви. После этого на каждом пути рассмотри оба решения для В. Так каждый путь учитывает все три элемента.
Перечисли листья, сгруппировав результаты по наличию А. При наличии А получаются {А}, {А, Б}, {А, В}, {А, Б, В}; без А — ∅, {Б}, {В}, {Б, В}. В каждой группе четыре результата.
Сосчитай листья: после решения для А их два, после Б — четыре, после В — восемь. Это соответствует правилу 2³ = 8. Значит, список содержит все подмножества.
Ответ: ∅, {А}, {Б}, {В}, {А, Б}, {А, В}, {Б, В}, {А, Б, В}; всего 8 подмножеств. В списке есть и пустое множество, и исходное множество. Проверка по числу листьев подтверждает, что результат полный.
Можно пропустить один из возможных выборов на шаге, если провести ветви не для всех вариантов. Обычно так происходит, когда начинают быстро рисовать дерево и не сверяют ветви с условием. Проверяй каждый узел: перечисли разрешённые продолжения и убедись, что каждой возможности соответствует ветвь.
Иногда промежуточный узел принимают за завершённый вариант. Но в таком узле выборы ещё продолжаются, поэтому он не задаёт полный путь. Проверь, что каждый записанный результат находится в конце пути, то есть у листа.
При переборе подмножеств часто забывают пустое множество или само исходное множество. Пустое множество получается, если ни один элемент не включён, а исходное — если включены все элементы. Для проверки пройди по каждому элементу и убедись, что учтены оба решения.
Один результат могут посчитать повторно, если менять порядок элементов или записывать наборы неаккуратно. Чтобы этого избежать, заранее выбери порядок элементов и следуй ему на каждом уровне дерева. В конце сравни записи: каждый лист должен давать отдельный результат, не совпадающий с другими.
Для работы с деревом нужно уметь перечислять элементы множества, понимать порядок последовательных действий и внимательно читать условие задачи. Эти умения помогают решить, какие именно ветви разрешены и когда путь становится завершённым. Если условие меняет выборы, это тоже нужно учитывать при продолжении дерева.
Деревья перебора применяются в комбинаторных задачах, где требуется найти или сосчитать сочетания. Они полезны и при составлении алгоритмов: если программа должна рассмотреть все допустимые случаи, дерево помогает разложить работу на шаги. Значит, этот способ связывает запись схемы с последовательным выполнением действий.
Что показывает путь от корня дерева до листа?
Он показывает последовательность выборов от начала до завершения. Поэтому один такой путь соответствует одному полному варианту или одному подмножеству.
Как понять, сколько ветвей нужно провести из узла?
Нужно посмотреть, какие выборы разрешены условием именно на этом шаге. Проведи по одной ветви для каждого возможного выбора, не добавляя запрещённые и не пропуская допустимые.
Почему при переборе подмножеств у каждого элемента два решения?
Подмножество может содержать данный элемент или не содержать его. Это два исчерпывающих решения, поэтому для каждого элемента проводят две ветви.
Нужно ли включать пустое множество в список подмножеств?
Да. Пустое множество не содержит ни одного элемента, и оно является подмножеством любого множества.
Как быстро проверить, все ли варианты перечислены?
Сосчитай листья: каждый допустимый полный путь заканчивается одним листом. Для подмножеств из n элементов сравни число листьев с 2ⁿ; также проверь каждый узел на пропущенные выборы.
Дерево перебора вариантов. Дерево перебора подмножеств