
- •Оглавление
- •1. Множества
- •1.1. Основные понятия
- •1.2. Способы задания множеств
- •1.3. Операции над множествами
- •Приоритеты операций над множествами
- •1.4. Свойства операций над множествами
- •1.5. Методы доказательства теоретико-множественных тождеств
- •1.5.1. Метод двух включений
- •1.5.2. Метод эквивалентных преобразований
- •1.5.3. Метод характеристических функций
- •1.5.4. Метод логических функций
- •1.5.5. Теоретико-множественный метод
- •1.6. Способы представления множества в памяти эвм
- •1.7. Алгоритмы реализации операций над множествами
- •Практическое занятие 1.1 Операции над множествами
- •Задания
- •Варианты заданий
- •Практическое занятие 1.2 Теоретико-множественные тождества
- •Задания
- •Варианты заданий
- •Контрольные вопросы
- •2. Комбинаторные объекты
- •2.1. Введение
- •2.2. Метод поиска с возвращением
- •2.3. Подмножества
- •2.4. Перестановки
- •2.5. Размещения
- •2.6. Размещения с повторениями
- •2.7. Сочетания
- •2.8. Перестановки с повторениями
- •2.9. Сочетания с повторениями
- •2.10. Упорядоченные разбиения множества
- •2.11. Разбиения множества
- •2.12. Использование алгоритмов порождения комбинаторных объектов при проектировании полнопереборных алгоритмов решения задач выбора
- •2.13. О неэффективности полнопереборных алгоритмов. Пример
- •Времена обработки деталей на станках a и b
- •Времена окончания обработки деталей на станках a и b
- •Времена окончания обработки деталей на станках a и b
- •Времена окончания обработки деталей на станках a и b
- •Практическое занятие 2.1 Алгоритмы порождения комбинаторных объектов
- •Задания
- •Практическое занятие 2.2 Разбиения множеств
- •Задания
- •Количество упорядоченных разбиений
- •Практическое занятие 2.3
- •Задачи выбора
- •Цель занятия: приобретение практических навыков в использовании алгоритмов порождения комбинаторных объектов при проектировании алгоритмов решения задач выбора.
- •Задания
- •Варианты заданий
- •Контрольные вопросы
- •Библиографический список
2. Комбинаторные объекты
2.1. Введение
Под комбинаторным объектом будем понимать набор, составленный из элементов множества и обладающий свойством, определяющим заданный комбинаторный объект.
Основными простейшими комбинаторными объектами являются подмножество, перестановка, размещение, сочетание, разбиение. При изучении комбинаторного объекта необходимо:
- подсчитать количество всех различных комбинаторных объектов заданного типа (обладающих заданным свойством), которые можно составить из элементов заданного множества;
- определить способ (алгоритм) получения всех различных комбинаторных объектов заданного типа, которые можно составить из элементов заданного множества.
При подсчёте количества всех различных комбинаторных объектов заданного типа часто применяется правило произведения, которое заключается в следующем.
Пусть требуется выполнить одно за другим K действий. Если первое действие можно выполнить N1 способами, второе действие - N2 способами, третье действие - N3 способами и так до K-го действия, которое можно выполнить Nk способами, то все K действий могут быть выполнены N1N2N3…Nk способами.
2.2. Метод поиска с возвращением
Пусть задача имеет множество решений, каждое из которых можно представить последовательностью R конечной, но, в общем случае, неопределённой длины, состоящей из элементов, принадлежащих некоторому множеству А, и требуется найти все решения задачи. Их можно найти, используя метод поиска с возвращением, который заключается в следующем.
Для получения одного решения будем последовательно, элемент за элементом, формировать последовательность R. Сначала определим подмножество элементов множества А, которые можно поставить на 1-ое место и один из них поставим на 1-ое место. Затем, по аналогии, будем определять и ставить элементы на 2-ое, 3-е и т.д. место, продвигаясь по последовательности R вперёд, т.е. делать шаги вперёд. Так, двигаясь вперёд, на некотором i-ом шаге мы либо получим одно из ре-
шений (случай 1), либо обнаружим, что во множестве А нет ни одного элемента, который можно поставить на очередное место, не нарушая условие задачи (случай 2). Случай 2 означает, что ни одно решение задачи не содержит в качестве первых i-1 элементов элементы, поставленные в последовательность R. В этой ситуации нужно сделать шаг назад, к i-1-му месту и попытаться поставить другой допустимый элемент на i-1-ое место. В случае 1, когда решение получено, для продолжения поиска других решений необходимо попытаться поставить другой допустимый элемент на i-ое место, а если такого элемента нет, то нужно сделать шаг назад. Если нужно выполнить шаг назад тогда, когда находимся на 1-ом месте в последовательности R, то поиск решений прекращается, все решения найдены.
Метод поиска с возвращением можно реализовать на ЭВМ, используя рекурсивный или итеративный алгоритмы, структуры которых представлены на рис.2.1 и рис.2.2 соответственно.
Ri
:=
x
М
:= множество элементов, которые можно
поставить на i-ое
место
+
Шаг
вперёд к i+1
Поиск
с возвращением(i+1)
Рис.2.1. Рекурсивный алгоритм поиска с возвращением
Инициализация
стека.
Множество
элементов, которые можно поставить на
1-ое место, положить в стек.
i
:=
1
М := взять из стека
+
Ri
:= x
| xM
M-{x}
в стек
+
Шаг
вперёд i
:= i+1
Множество
элементов, которые можно поставить на
i-ое
место, положить в стек.
Шаг
назад
i
:=
i-1
Рис.2.2. Итеративный алгоритм поиска с возвращением
Рекурсивная подпрограмма формирует i-ый элемент последовательности R, поэтому при первом обращении к ней нужно передать параметр, равный 1.
Метод поиска с возвращением можно также использовать, если требуется определить, существует ли решение задачи, подсчитать количество возможных решений или найти одно из возможных решений.