Множества#

”Множество людей могут говорить хорошие вещи, но очень немногие умеют слушать, так как это требует силы ума.” (Р. Тагор)

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

В этой абстракции, с практической точки зрения, должны быть реализованы операции доступа:

  • проверка принадлежности заданного элемента множеству;

  • проверка включения одного множества в другое множество

и операции модификации:

  • добавление элемента в множество;

  • извлечение элемента из множества,

а также операции над множествами:

  • объединение двух множеств;

  • пересечение двух множеств;

  • разность двух множеств.

В объектно-ориентированном программировании указанная абстракция может быть инкапсулирована в соответствующем классе, но не обязательно. Любые данные, расположенные в любом порядке, - это уже множество. Даже если они хранятся в обычном массиве или списке.

Понятие множества#

Источники: Кузнецов - Дискретная математика для инженера; Казанский - Дискретная математика: краткий курс

Основатель теории множеств Георг Кантор определял множество так: “многое, понимаемое как единое”.

Примеры. 1. Хоккейная команда “Адмирал” - это множество хоккеистов.

  1. Товары, которые покупатель сложил в корзину в интернет-магазине, образуют множество.

  2. Все функции, объявленные в скрипте на Python, образуют множество. Функции без параметров - подмножество данного множества.

  3. Рассмотрим множество \(A\) имён переменных, используемых в функциях, и множество имён переменных \(B\), используемых в основном коде. Желательно, чтобы у этих множеств не было общих элементов. На языке теории множеств говорят, что множества не пересекаются: \(A \cap B = \varnothing\).

Запишем свойство отсутствия пересечения у двух множеств \(A\) и \(B\) на языке логики предикатов:

\(A \cap B = \varnothing \quad \Longleftrightarrow \quad \neg \exists x\, (x \in A \land x \in B)\)

Другим способом:

\(A \cap B = \varnothing \quad \Longleftrightarrow \quad \forall x\, (x \notin A \vee x \notin B)\)

  1. Множество решений уравнения \(\sin x = 1\) в действительных числах:

\(M = \{x \in \mathbb R \colon \sin x = 1\} = \{x \in \mathbb R \colon \exists k \in \mathbb Z \, (x = \pi/2 + 2k\pi)\}\)

Включение и равенство множеств#

Равенство двух множеств \(A\) и \(B\) означает следующее: всякий элемент множества \(A\) принадлежит множеству \(B\), и всякий элемент множества \(B\) принадлежит множеству \(A\). Иными словами, равные множества состоят из одних и тех же элементов.

Пример. Множество равнобедренных треугольников равно множеству треугольников с двумя равными углами.

Множество \(A\) включено в множество \(B\) (является его подмножеством: \(A \subset B\)), если всякий элемент множества \(A\) принадлежит множеству \(B\).

Запишем это определение на языке логики предикатов:

\(A \subset B \quad \Longleftrightarrow \quad \forall x\, (x \in A \to x \in B)\)

Пустое множество \(\varnothing\) - это множество, не содержащее элементов.

Докажем, что \(\varnothing \subset A\) для любого множества \(A\). В самом деле,

\(\forall x\, (x \in \varnothing \to x \in A) = (\forall x\, (0 \to (x \in A))) = \forall x\, 1 = 1\)

Характеристический вектор#

Пусть задано конечное универсальное множество \(U\), в котором \(n\) элементов (пишут: \(|U| = n\)). Множество возможных подмножеств множества \(U\) называется булеаном (обозначение \(\mathcal P(U)\) или \(2^U\)). В булеане \(2^n\) элементов.

Например, если \(U = \{1, 2, 3\}\), то \(\mathcal P(U) = \{ \varnothing, \{1\}, \{2\}, \{3\}, \{1, 2\}, \{1, 3\}, \{2, 3\}, \{1, 2, 3\} \}\).

Чтобы задать любое множество из \(\mathcal P(U)\), можно пронумеровать все \(n\) элементов множества \(U = \{a_1, a_2, \ldots, a_n\}\) и составить таблицу, в которой указана принадлежность каждого элемента универсума \(U\) множеству \(A\).

Пример. В следующей таблице задано множество \(A = \{a_2, a_4\}\).

\(a_1\)

\(a_2\)

\(a_3\)

\(a_4\)

0

1

0

1

Двоичный вектор, который задает некоторое множество \(A\) (при выбранной нумерации элементов множества \(U\)) называется характеристическим вектором множества \(A\).

Диаграммы Венна#

Диаграмма Венна позволяет получить визуальное представление множеств в виде замкнутых областей на плоскости. Универсальное множество представляется внутренними точками прямоугольника, а другие множества представляются точками кругов, лежащих внутри этого прямоугольника.

На рисунке показаны три случая взаимосвязи двух множеств.

Операции над множествами#

Источник: White, Ray - Practical discrete mathematics

Всякому подмножеству \(A\) некоторого универсума \(U\) соответствует одноместный предикат (характеристическое свойство) \(P(x) = \{x \in U \colon x \in A\}\). И обратно, всякий одноместный предикат \(P(x)\), определенный на множестве \(U\), задает множество (область истинности предиката) \(I_P = \{x \in U \colon P(x)\}\). (В логике множество составляет объём понятия, а его характеристическое свойство составляет содержание понятия.)

Пусть \(A, B \subset U\) - два множества. Применим к их характеристическим свойствам операцию логического сложения (дизъюнкции). Получим множество \(A \cup B\), называемое объединением множеств \(A\) и \(B\). По определению,

\(A \cup B = \{x \colon x \in A \vee x \in B\}\)

Если применить к характеристическим свойствам множеств операцию конъюнкции, то получится множество, состоящее из элементов, принадлежащих одновременно к обоим множествам. Это пересечение множеств \(A \cap B\). По определению,

\(A \cap B = \{x \colon x \in A \land x \in B\}\)

Если инвертировать характеристическое свойство множества \(A\), получим его дополнение \(\overline{A}\). Другое обозначение: \(A^c\). По определению,

\(\overline{A} = \{x \in U \colon x \notin A\}\)

Разность множеств \(A \setminus B\) состоит из всех элементов множества \(A\), не принадлежащих множеству \(B\). По определению, \(A \setminus B = A \cap \overline{B}\).

Упражнение. Запишите характеристическое свойство разности двух множеств:

\(A \setminus B = \{x \colon \; {\color{red} ? }\; \}\)

Основные тождества#

Коммутативность:

\(A \cap B = B \cap A, \quad A \cup B = B \cup A\)

Ассоциативность:

\((A \cap B) \cap C = A \cap (B \cap C)\)

\((A \cup B) \cup C = A \cup (B \cup C)\)

Идемпотентность:

\(A \cap A = A, \quad A \cup A = A\)

Дистрибутивность:

\(A \cap (B \cup C) = (A \cap B) \cup (A \cap C)\)

\(A \cup (B \cap C) = (A \cup B) \cap (A \cup C)\)

Законы поглощения:

\(A \cap (A \cup B) = A\)

\(A \cup (A \cap B) = A\)

Законы де Моргана:

\(\overline{A \cup B} = \overline{A} \cap \overline{B}\)

\(\overline{A \cap B} = \overline{A} \cup \overline{B}\)

Инволюция:

\(\overline{\overline{A}} = A\)

Законы дополнения:

\(A \cap \overline{A} = \varnothing, \quad \overline{\varnothing} = U\)

\(A \cup \overline{A} = U, \quad \overline{U} = \varnothing\)

Законы тождества:

\(A \cap U = A, \quad A \cap\varnothing = \varnothing\)

\(A \cup \varnothing = A, \quad A \cup U = U\)

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

Докажем, например, закон де Моргана \(\overline{A \cup B} = \overline{A} \cap \overline{B}\).

Обозначим (для произвольного элемента универсума \(x \in U\)) характеристическое свойство принадлежности множеству \(A\) через \(a\) (свойство \(x \in A\)). Аналогично свойство \(x \in B\) обозначим через \(b\). Придем к равносильности:

\(\neg (a \vee b) = \neg a \land \neg b\)

Законы тождества сводятся к знакомым равносильностям логики высказываний:

\(a \land 1 = a, \quad a \land 0 = 0\)

\(a \vee 0 = a, \quad a \vee 1 = 1\)

Упражнение. Симметрическая разность двух множеств \(A \triangle B\) соответствует логической операции “сложение по модулю 2” \(a \oplus b\). Пользуясь описанным методом, докажите тождество:

\( A \triangle B = (A \cup B) \cap \overline{(A \cap B)} \)

С помощью основных тождеств можно получать новые тождества.

Пример. Докажем тождество \(\overline{A \setminus B} = \overline{A} \cup B\).

В самом деле,

\(\overline{A \setminus B} = \overline{A} \cup B = \overline{A \cup \overline{B}} = \overline{A} \cap \overline{\overline{B}} = \overline{A} \cap B\)

Упражнение. Пользуясь описанным методом, докажите тождество \((A \cup B) \setminus (A \cap B) = (A \setminus B) \cup (B \setminus A)\).

Типовые задачи#

Источники: Андерсон - Дискретная математика и комбинаторика; Конышева, Мешков - Задачник по дискретной математике

Пример. Опишем множество, обозначенное штриховкой на диаграмме Венна.

Для этого построим таблицу истинности составного высказывания, выражающего принадлежность элемента закрашенному множеству.

\(a\)

\(b\)

\(c\)

\(F(a, b, c)\)

0

0

0

0

0

0

1

0

0

1

0

1

0

1

1

0

1

0

0

1

1

0

1

0

1

1

0

1

1

1

1

1

Теперь запишем формулу для полученной булевой функции. Для этого сперва построим СДНФ:

\(F(a, b, c) = \overline{a} \cdot b \cdot \overline{c} \vee a \cdot \overline{b} \cdot \overline{c} \vee a \cdot b \cdot \overline{c} \vee a \cdot b \cdot c\)

Сократим ДНФ:

\(F(a, b, c) = \overline{a} \cdot b \cdot \overline{c} \vee a \cdot \overline{b} \cdot \overline{c} \vee a \cdot b \cdot \overline{c} \vee a \cdot b \cdot c \vee a \cdot b \vee b \cdot \overline{c} =\)

\(= a \cdot b \vee b \cdot \overline{c} \vee a \cdot \overline{b} \cdot \overline{c}\)

Таким образом, закрашенное множество выражается формулой:

\((A \cap B) \cup (B \setminus C) \cup (A \setminus (B \cup C))\)

На диаграмме Эйлера видно, что формулу можно ещё сократить:

\((A \cap B) \cup (B \setminus C) \cup (A \setminus C)\)

Пример. Решим систему уравнений с множествами:

\( \left\{ \begin{aligned}A \setminus X &= B\\ A \cup X &= C \end{aligned} \right. \)

Найдем условия на множества \(A, B, C\), при которых система имеет решение. Для этого заметим, что (из второго уравнения) множество \(C\) содержит множество \(A\), и (из первого уравнения) множество \(A\) содержит множество \(B\).

Таким образом, для разрешимости системы обязано выполняться соотношение \(B \subset A \subset C\).

Теперь докажем, что если это выполнено, то система уравнений всегда имеет решение. Нарисуем диаграмму Венна.

Из второго уравнения следует, что множество \(X\) содержит в себе множество \(C \setminus A\), то есть \(C \setminus A \subset X\). Из первого уравнения вытекает, что \(A \setminus B \subset X\).

Следовательно, \(X\) содержит в себе множество \((C \setminus A) \cup (A \setminus B) = C \setminus B\). Итак, \(C \setminus B \subset X\).

С другой стороны, множество \(X\) не может быть шире, чем \(C \setminus B\). В самом деле, если существует \(x\), такой, что \(x \in X\) и при этом \(x \notin C\) или \(x \in B\), то в первом случае получаем противоречие со вторым уравнением, а во втором случае - с первым уравнением.

Ответ: \(X = C \setminus B\) при условии \(B \subset A \subset C\).