Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пособие рязанова.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
1.55 Mб
Скачать

2. Комбинаторные объекты

2.1. Введение

Под комбинаторным объектом будем понимать набор, составленный из элементов множества и обладающий свойством, определяющим заданный комбинаторный объект.

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

- подсчитать количество всех различных комбинаторных объектов заданного типа (обладающих заданным свойством), которые можно составить из элементов заданного множества;

- определить способ (алгоритм) получения всех различных комбинаторных объектов заданного типа, которые можно составить из элементов заданного множества.

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

Пусть требуется выполнить одно за другим K действий. Если первое действие можно выполнить N1 способами, второе действие - N2 способами, третье действие - N3 способами и так до K-го действия, которое можно выполнить Nk способами, то все K действий могут быть выполнены N1N2N3Nk способами.

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 | xM

M-{x} в стек

+

Шаг вперёд i := i+1

Множество элементов, которые можно поставить на i-ое место, положить в стек.

Шаг назад

i := i-1

Рис.2.2. Итеративный алгоритм поиска с возвращением

Рекурсивная подпрограмма формирует i-ый элемент последовательности R, поэтому при первом обращении к ней нужно передать параметр, равный 1.

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