534
ГЛАВА 9. СТРУКТУРЫ ДАННЫХ
9.3.5. Множества
Множество — это тип данных, значения которого представляют множе-
ства значений другого, ранее определенного типа, называемого базовым ти-
пом множества. Особенностью конструктора set of
T
является то, что опре-
деляемые с его помощью объекты в высшей степени зависят от количества
элементов в типе
T
и в принципе не содержат в себе в качестве компонент
значения базового типа. В данном отношении конструктор множеств отли-
чается от ранее рассмотренных нами конструкторов, которые интегрировали
значения базовых типов в определяемые ими структуры данных. Правда, са-
мое тупое из приходящих на ум представлений множества: перечень всех
элементов данного множества ({зн
1
, . . . , зн
n
} : T ) , — конечно, содержало
бы эти элементы. Но недостатки данного представления очевидны (тем не
менее, в одном из упражнений Вам предлагается найти случаи, когда такое
представление множества оптимально, и подумать, как его организовать в
таких случаях).
Другое представление множества естественно подсказывается изоморф-
ной алгебре множеств математической структурой функций M : T → {0, 1}.
12
Поскольку функция на конечном множестве, в свою очередь, то же самое, что
массив, то множество может быть представлено как массив булевских значе-
ний.
type
Set_T=
array
[T]
of
Boolean;
Просим извинения у любителей
C/C++/C#
, но примитивная логическая
структура этих языков не позволяет выразить данную идею столь же просто и
ясно. А в какие ловушки ведут попытки держаться слишком близко к деталям
реализации, мы уже видели.
13
Поскольку операции алгебры множеств над множествами A и B сводятся
к логическим операциям над значениями предикатов x ∈ A x ∈ B, вычисле-
ние объединений, пересечений и других операций булевой алгебры сводится
к циклу по всем элементам
T
с применением соотвествующих булевых опера-
ций к их элементам. Проверка равенства множеств, включения одного мно-
жества в другое и подсчет числа элементов множества также производится
12
Еще раз повторим, что изоморфизм математических понятий исключительно важен для
программиста, поскольку изоморфные структуры эквивалентны лишь с математической точ-
ки зрения, на практике они дают различные представления понятий.
13
Впрочем, так же в любой области человеческой деятельности. Попытка прямо достичь
цели чаще всего ведет в тупик, а победа, даже если она одержана, оказывается пирровой.