Задание 8: поисковые запросы, логика И/ИЛИ и круги Эйлера
Понимаем, как операторы И/ИЛИ меняют число найденных страниц, — это задание №8.
Поисковый запрос — это набор слов с логическими операторами; чем строже условие, тем меньше страниц находит поисковик.
Что проверяет задание 8
Дают несколько запросов и количество страниц, которые по ним нашлись (или просят расставить запросы по возрастанию/убыванию числа находок). Нужно понять, как операторы И/ИЛИ влияют на размер результата. Это задание на логику множеств, и круги Эйлера делают его наглядным.
Операторы запроса
| Оператор | Обозначение | Смысл |
| И | & (амперсанд) | страница содержит оба слова |
| ИЛИ | | (вертикальная черта) | страница содержит хотя бы одно слово |
Главное правило, которое решает почти все такие задания:
- «ИЛИ» расширяет результат — находок становится больше (или столько же).
- «И» сужает результат — находок становится меньше (или столько же).
Поэтому запрос с «|» всегда даёт не меньше страниц, чем каждое слово по отдельности, а запрос с «&» — не больше.
Круги Эйлера
Представьте два круга — множество страниц про «кошки» и про «собаки».
кошки | собаки— это объединение кругов (вся закрашенная площадь обоих).кошки & собаки— это пересечение (общая часть, где есть оба слова).
Очевидно: объединение ≥ каждого круга ≥ пересечение. Это и есть порядок по числу страниц.
Формула включений-исключений
Часто дают числа находок для запросов и просят вычислить недостающий. Работает формула: |A или B| = |A| + |B| − |A и B|.
Пример: по запросу «Москва» — 250 страниц, по «Париж» — 180, по «Москва | Париж» — 400. Сколько по «Москва & Париж»?
moskva = 250
parizh = 180
ili = 400 # Москва | Париж
i = moskva + parizh - ili # Москва & Париж
print("Москва & Париж:", i)
Вывод:
Москва & Париж: 30
Логика формулы: складывая две группы, мы дважды учли общие страницы, поэтому вычитаем их один раз, чтобы получить объединение. Зная объединение и обе группы, легко найти пересечение.
Упорядочивание запросов
Расставьте по возрастанию числа страниц: (1) спорт | футбол, (2) спорт & футбол, (3) спорт.
Пересечение всегда наименьшее, объединение — наибольшее, одиночное слово — между ними:
# Смоделируем как множества страниц
sport = set(range(1, 101)) # 100 страниц про спорт
futbol = set(range(80, 161)) # 81 страница про футбол (часть пересекается)
print("спорт & футбол:", len(sport & futbol))
print("спорт:", len(sport))
print("спорт | футбол:", len(sport | futbol))
Вывод:
спорт & футбол: 21 спорт: 100 спорт | футбол: 160
Порядок по возрастанию: спорт & футбол < спорт < спорт | футбол. То есть 2, 3, 1.
Задача с тремя словами
Иногда сравнивают запросы с тремя словами. Правило не меняется: чем больше слов через «И», тем строже и тем меньше находок; чем больше слов через «ИЛИ», тем больше. Сравним (кошки | собаки | рыбки) и (кошки & собаки) и одиночное кошки.
koshki = set(range(1, 121)) # 120 страниц
sobaki = set(range(100, 221)) # 121 страница
rybki = set(range(200, 261)) # 60 страниц
ili3 = koshki | sobaki | rybki # объединение трёх
i2 = koshki & sobaki # пересечение двух
print("кошки & собаки:", len(i2))
print("кошки:", len(koshki))
print("кошки | собаки | рыбки:", len(ili3))
Вывод:
кошки & собаки: 21 кошки: 120 кошки | собаки | рыбки: 260
Как и ожидалось: пересечение двух слов наименьшее (21), одиночное слово в середине (120), объединение трёх — наибольшее (260). Эта «лесенка» работает всегда и позволяет расставлять запросы по числу страниц, даже не вычисляя точные значения, — достаточно понимать, что строже, а что мягче.
Типичные ошибки
- Думают, что «И» даёт больше страниц (наоборот — меньше).
- Путают объединение и пересечение в формуле, забывают вычесть общее.
- В ответе пишут номера запросов в неверном порядке — перечитайте, просили «по возрастанию» или «по убыванию».
Итог
- «ИЛИ» (|) расширяет — страниц больше; «И» (&) сужает — меньше.
- Круги Эйлера: | — объединение, & — пересечение.
- Формула:
|A или B| = |A| + |B| − |A и B|. - Порядок: пересечение ≤ одиночное слово ≤ объединение.