Операции над множествами и диаграммы Венна
Учимся комбинировать множества: объединять, пересекать, вычитать — и видеть это на диаграммах Венна.
Операция над множествами — правило, которое из одного или нескольких множеств строит новое множество.
Зачем это нужно
Операции над множествами — это «арифметика коллекций». Найти пользователей, которые есть и в группе A, и в группе B (пересечение). Собрать всех, кто хоть в одной из рассылок (объединение). Понять, кого добавили в новой версии базы, а кого убрали (разности). Любая работа с фильтрами, тегами, правами доступа — это операции над множествами. В Python они встроены прямо в синтаксис, и это не случайно.
Пять основных операций
Пусть A и B — множества, а U — универсальное множество (то, из чего мы вообще выбираем элементы: например, все целые от 1 до 10).
| Операция | Обозначение | Определение словами | Python |
| Объединение | A ∪ B | элементы, которые в A или в B (или там и там) | A | B |
| Пересечение | A ∩ B | элементы, которые и в A, и в B | A & B |
| Разность | A \ B | элементы A, которых нет в B | A - B |
| Симм. разность | A △ B | элементы ровно в одном из множеств | A ^ B |
| Дополнение | Ā | элементы U, которых нет в A | U - A |
Связь с логикой здесь прямая и её полезно держать в голове: объединение — это «или», пересечение — это «и», дополнение — это «не». Поэтому всё, что мы потом узнаем про логику, будет эхом отзываться в теории множеств, и наоборот.
Диаграммы Венна: смотрим глазами
Диаграмма Венна — это два (или три) пересекающихся круга внутри прямоугольника. Прямоугольник — это универсум U, круги — множества. Закрашивая нужные области, мы видим результат операции:
- Объединение
A ∪ B— закрашены оба круга целиком. - Пересечение
A ∩ B— только «линза» в середине, общая часть. - Разность
A \ B— левый круг без общей части. - Симметрическая разность
A △ B— оба круга, кроме середины (то, что «либо там, либо там, но не в обоих»).
Диаграммы — не доказательство, а инструмент интуиции. Они помогают угадать тождество, а доказывать его мы будем строго. Но для трёх множеств диаграмма из трёх кругов уже отлично подсказывает, какие области входят в ответ.
Считаем мощность объединения: формула «сложил — вычел лишнее»
Сколько элементов в A ∪ B? Хочется сказать |A| + |B|, но это неверно: общие элементы мы посчитали бы дважды. Правильная формула:
|A ∪ B| = |A| + |B| − |A ∩ B|
Мы сложили размеры, а потом вычли пересечение, потому что оно учтено в обоих слагаемых. Это простейший случай принципа включения-исключения, к которому мы вернёмся в комбинаторике. Запомни идею: «сложил всё, вычел то, что посчитал дважды».
Проверяем операции на Python
U = set(range(1, 11)) # универсум: 1..10
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7}
print("A ∪ B =", sorted(A | B))
print("A ∩ B =", sorted(A & B))
print("A \\ B =", sorted(A - B))
print("A △ B =", sorted(A ^ B))
print("Дополнение A =", sorted(U - A))
# Проверка формулы мощности объединения
print("|A ∪ B| =", len(A | B))
print("|A| + |B| - |A ∩ B| =", len(A) + len(B) - len(A & B))
Вывод:
A ∪ B = [1, 2, 3, 4, 5, 6, 7] A ∩ B = [4, 5] A \ B = [1, 2, 3] A △ B = [1, 2, 3, 6, 7] Дополнение A = [6, 7, 8, 9, 10] |A ∪ B| = 7 |A| + |B| - |A ∩ B| = 7
Мы выводим результаты через sorted(...), чтобы порядок был предсказуемым (само множество порядок не хранит). И видим: формула мощности объединения даёт ровно столько же, сколько прямой подсчёт — 7.
Непересекающиеся множества и разбиения
Множества A и B называются непересекающимися (дизъюнктными), если A ∩ B = ∅ — у них нет общих элементов. Для таких множеств формула упрощается: |A ∪ B| = |A| + |B|.
Если univers U разбит на непересекающиеся куски, объединение которых даёт весь U, это называется разбиением. Разбиения встретятся нам снова в теме об отношениях эквивалентности — там они играют центральную роль.
Парадокс брадобрея: где интуиция множеств ломается
Наивное «множество — это любая совокупность» однажды привело математику к кризису. В 1901 году Бертран Рассел заметил: рассмотрим «множество всех множеств, которые не содержат себя в качестве элемента». Содержит ли оно само себя? Если да — то по определению не должно; если нет — то должно. Противоречие в обе стороны! Бытовая версия — парадокс брадобрея: деревенский брадобрей бреет всех, кто не бреется сам; кто же бреет брадобрея?
Этот парадокс показал, что нельзя строить множества из любого свойства бездумно. В ответ математики создали аксиоматическую теорию множеств (ZFC), где «слишком большие» совокупности множествами не считаются. Для нас, изучающих дискретную математику, это далёкая граница: мы работаем с конечными и хорошо определёнными множествами, где никаких парадоксов нет. Но полезно знать, что под привычным понятием «множество» лежит глубокий фундамент — и что в математике даже «очевидные» определения иногда требуют осторожности.
Типичные ошибки
- Считать
|A ∪ B| = |A| + |B|всегда. Это верно только для непересекающихся множеств. Иначе нужно вычесть пересечение. - Путать
\и△. РазностьA \ Bнесимметрична:A \ B ≠ B \ A. Симметрическая разность△, наоборот, симметрична. - Забывать про универсум при дополнении. Дополнение зависит от того, что считать «всем»: дополнение чётных чисел внутри
{1..10}— это нечётные от 1 до 10, а не «все нечётные на свете».
Итог
- Пять операций:
∪(или),∩(и),\(разность),△(ровно в одном), дополнение (не). - Диаграммы Венна дают интуицию, но не заменяют доказательство.
|A ∪ B| = |A| + |B| − |A ∩ B|— простейшее включение-исключение.- В Python:
|,&,-,^— те же операции одним символом.