Операции над множествами и диаграммы Венна

Учимся комбинировать множества: объединять, пересекать, вычитать — и видеть это на диаграммах Венна.

Операция над множествами — правило, которое из одного или нескольких множеств строит новое множество.

Зачем это нужно

Операции над множествами — это «арифметика коллекций». Найти пользователей, которые есть и в группе A, и в группе B (пересечение). Собрать всех, кто хоть в одной из рассылок (объединение). Понять, кого добавили в новой версии базы, а кого убрали (разности). Любая работа с фильтрами, тегами, правами доступа — это операции над множествами. В Python они встроены прямо в синтаксис, и это не случайно.

Пять основных операций

Пусть A и B — множества, а Uуниверсальное множество (то, из чего мы вообще выбираем элементы: например, все целые от 1 до 10).

ОперацияОбозначениеОпределение словамиPython
ОбъединениеA ∪ Bэлементы, которые в A или в B (или там и там)A | B
ПересечениеA ∩ Bэлементы, которые и в A, и в BA & B
РазностьA \ Bэлементы A, которых нет в BA - B
Симм. разностьA △ Bэлементы ровно в одном из множествA ^ B
ДополнениеĀэлементы U, которых нет в AU - 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: |, &, -, ^ — те же операции одним символом.
Проверьте себя
1. Чему равно A △ B (симметрическая разность) для A = {1,2,3}, B = {2,3,4}?
A{2, 3}
B{1, 2, 3, 4}
C{1}
D{1, 4}
2. Для каких множеств верно |A ∪ B| = |A| + |B|?
AТолько если A ∩ B = ∅ (множества не пересекаются)
BДля любых множеств
CТолько если A = B
DТолько если одно из них пустое
3. Какой операции множеств соответствует логическое «и»?
AОбъединению A ∪ B
BПересечению A ∩ B
CРазности A \\ B
DДополнению
Поддержать проект