Комбинаторные алгоритмы для программистов

          

Множества и мультимножества


Не существует формального определения множества; считается что это понятие первичное и не определяется. Так, можно говорить, что множество есть объединение различных элементов, но при этом мы оставляем неопределяемыми понятия "объединение" и "элементы". Дадим следующее определение множеству: множество - это неупорядоченная совокупность различных объектов или структура данных, используемая для представления множества. Мультимножество есть объединение не обязательно различных элементов; его можно считать множеством, в котором каждому элементу поставлено в соответствие положительное целое число, называемое кратностью.

Конечное множество

Множества и мультимножества
будем записывать в следующем виде:

Множества и мультимножества

где

Множества и мультимножества
- элементы
Множества и мультимножества
, обязательно различные! Мощность множества
Множества и мультимножества
обозначается как
Множества и мультимножества
, для выписанного выше множества мощность записывается так
Множества и мультимножества
. Если
Множества и мультимножества
- конечное мультимножество, то будем записывать его в следующем виде:

Множества и мультимножества

Здесь все

Множества и мультимножества
различны и
Множества и мультимножества
- кратность элемента
Множества и мультимножества
. В этом случае мощность
Множества и мультимножества
равна

Множества и мультимножества

Наиболее общими операциями на множествах и мультимножествах являются операции объединения и пересечения. Для множеств эти операции будем обозначать

Множества и мультимножества
и
Множества и мультимножества
, а для мультимножеств -
Множества и мультимножества
и
Множества и мультимножества
. Последовательное и связанное представление последовательностей можно использовать для множеств и мультимножеств очевидным способом. Индуцируя искусственный порядок элементов множества или используя собственный порядок, если он существует, можно рассматривать множество как последовательность. Аналогично, как последовательность можно рассматривать и мультимножество, или, для того чтобы сэкономить место, его можно рассматривать как последовательность пар, каждая из которых состоит из элемента и его кратности.

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

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

С целью идентификации считаем, что каждое из непересекающихся подмножеств множества
Множества и мультимножества
имеет имя. Имя - это просто один из элементов подмножества, или, иначе, - представитель подмножества. Когда мы будем ссылаться на имя подмножества, то будем под этим подразумевать его представителя. Рассмотрим, например, множество
Множества и мультимножества


разбитое на четыре непересекающихся подмножества

Множества и мультимножества


(6.1)
В каждом из подмножеств, взятый в скобки элемент является его именем. Если нам нужно найти подмножество, в котором содержится восьмерка, искомым ответом будет 7, то есть имя подмножества, содержащего восьмерку. Если нужно взять объединение подмножеств с именами 2 и 10, получим разбиение множества
Множества и мультимножества


следующего вида:

Множества и мультимножества


Именем множества
Множества и мультимножества
Множества и мультимножества


Множества и мультимножества
может быть или 2, или 10.Предполагаем, что вначале имеется разбиение множества
Множества и мультимножества


на
Множества и мультимножества
подмножеств, каждое из которых состоит из одного элемента
Множества и мультимножества


(6.2)
и имя каждого из них есть просто этот единственный элемент. Это разбиение преобразуется путем применения операций объединения вперемешку с операциями отыскания. Такая кажущаяся на первый взгляд надуманной задача чрезвычайно полезна в определенных комбинаторных алгоритмах; пример ее полезности виден в "жадном" алгоритме (лекция 16).

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


и
Множества и мультимножества
образует новое подмножество, содержащее все элементы множеств
Множества и мультимножества
и
Множества и мультимножества
. Процедура (операция)
Множества и мультимножества


выдает имя множества, содержащего
Множества и мультимножества
. Например, если нужно множество,содержащее
Множества и мультимножества
, объединить с множеством, содержащим
Множества и мультимножества
, необходимо выполнить следующую последовательность операторов:
Множества и мультимножества


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


Такой структурой данных является представление в виде леса с указателями отца, как показано на рис. 4.5 лекции 4. Каждый элемент
Множества и мультимножества
множества будет узлом леса, а отцом его будет элемент из того же подмножества, что и
Множества и мультимножества
. Если элемент не имеет отца, то есть является корнем, то он будет именем своего подмножества. В соответствии с этим разбиение 5.1 может быть представлено так:

Множества и мультимножества

Рис. 6.1.  Представление разбиения

При таком представлении процедура (операция)
Множества и мультимножества
состоит в переходах по указателям отцов от
Множества и мультимножества
до корня, то есть имени, его подмножества. Процедура (операция)
Множества и мультимножества
состоит в связывании вместе некоторым образом деревьев, имеющих корни
Множества и мультимножества
и
Множества и мультимножества
. Например, такую связь можно осуществить, сделав
Множества и мультимножества
отцом
Множества и мультимножества
.

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


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

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

Множества и мультимножества


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


Содержание раздела