Дискретная математика
Discrete Math на собеседовании
На интервью в Google Senior Engineer часто встречаются задачи «Докажите нижнюю оценку для данного алгоритма» или «Почему данный подход оптимален?». В Meta Design Review - «Объясните, почему Bloom Filter с такими параметрами даёт нам гарантию». Дискретная математика - это не теория ради теории, это язык объяснения и доказательства в инженерных дискуссиях.
- **Google L6 интервью:** задачи на подсчёт в комбинаторном стиле (пути в сетке с препятствиями, stars-and-bars для rate limiting) проверяют глубину, а не скорость
- **Meta System Design:** «Сколько бит нужно для Bloom Filter с fp_rate=0.01 для 10^9 элементов?» - прямой вопрос на формулу m = -n*ln(ε)/(ln2)²
- **Amazon Leadership Principles:** «Докажите, что данный алгоритм распределения задач оптимален» - инвариант + нижняя оценка
- **Coding interviews (LeetCode Hard):** двудольность, SCC, задачи на E[X] - стандарт для Staff Engineer позиций
Предварительные знания
Задачи на подсчёт: комбинаторика на интервью
В FAANG-интервью 80% задач на подсчёт сводятся к 5 паттернам: permutation, combination, partition, Catalan, Stirling - их суммарная частота на LeetCode превышает 1200 задач. Задачи на подсчёт появляются в кодинг-интервью часто в замаскированном виде: «сколько способов разложить», «сколько путей в сетке», «сколько сочетаний». Ключ - распознать тип задачи (перестановки, сочетания, stars-and-bars) и перевести на язык формул.
**Ключевые формулы подсчёта:** - **Перестановки:** P(n,k) = n!/(n-k)! - упорядоченный выбор k из n - **Сочетания:** C(n,k) = n!/(k!(n-k)!) - неупорядоченный выбор k из n - **Stars and bars:** C(n+k-1, k) - k одинаковых объектов в n ящиков - **Принцип включений-исключений:** |A∪B∪C| = Σ|Aᵢ| − Σ|Aᵢ∩Aⱼ| + |A∩B∩C| - **Мультиномиальный коэффициент:** n!/(n₁!·n₂!·...·nₖ!) - перестановки с повторениями
**Паттерн распознавания на интервью:** «сколько способов выбрать X из Y» без порядка = сочетания. С порядком = перестановки. «Разложить одинаковые объекты по различимым ящикам» = stars and bars. «Хотя бы одно / не более» = включения-исключения или дополнение.
На интервью часто проверяют: можете ли перейти от DP-решения к закрытой формуле. Задача «пути в сетке» решается DP за O(mn) или формулой C(m+n,m) за O(1). Умение объяснить оба подхода - признак глубокого понимания.
Нужно выбрать команду из 3 разработчиков из группы в 10 человек. Порядок не важен. Сколько способов?
Граф-задачи: двудольность и компоненты связности
Теория графов на FAANG-интервью проверяется через конкретные алгоритмические задачи. Два классических паттерна: проверка двудольности (bipartite checking) и нахождение сильно связных компонент (SCC). Оба решаются обходом графа, но с разной целью.
**Двудольный граф (Bipartite):** вершины разбиваются на два множества U и V, рёбра только между U и V. Эквивалентно: граф не содержит нечётных циклов. Алгоритм: BFS с 2-раскраской за O(V+E). **Сильно связные компоненты (SCC):** в ориентированном графе компонента, где из любой вершины достижимы все остальные. Алгоритм Косараю: два обхода DFS за O(V+E).
**Применение SCC в реальных задачах:** разрешение зависимостей пакетов (circular dependencies = один SCC), оптимизация импортов в компиляторах, определение «сильных» кластеров в социальных сетях. На интервью Meta часто спрашивают про граф дружбы.
На интервью всегда уточняйте: граф ориентированный или нет? Простой или мультиграф? Связный или нет? SCC имеет смысл только для ориентированных графов. Для неориентированных используют WCC (weakly connected components) через Union-Find.
Граф содержит нечётный цикл. Что можно утверждать?
Вероятностные задачи и E[X] на интервью
Вероятностные задачи на интервью Google/Meta проверяют понимание условной вероятности, Байеса и линейности E[X]. Часто это головоломки, которые кажутся сложными, но решаются элегантно через правильный выбор случайного пространства.
**Классические паттерны вероятностных задач на интервью:** - **Задача о встрече:** два человека приходят случайно в [0, T], ждут W минут. P(встреча)? - **Задача о монетах:** E[бросков до k орлов подряд] - **Задача о купонах:** E[попыток купить все n различных купонов] - **Задача о секретаре:** оптимальная стратегия выбора (37% rule) - **Парадокс Монти Холла:** P(выиграть при смене двери) = 2/3
**Монти Холл на интервью:** правильный ответ (2/3 при смене) важен, но ещё важнее - объяснение. Ключ: после открытия двери условная вероятность перераспределяется. P(приз за первой дверью | открыта пустая) = 1/3, P(приз за другой | открыта пустая) = 2/3. Байесовское обновление.
Задача о купонах: E[X] = n·Hₙ ≈ n·ln(n). Для n=52 (карты): E[X] ≈ 236. Это «реклама» - почему коллекционные наборы так хорошо продаются: в среднем приходится купить в 4.5 раза больше карт, чем различных типов.
Задача о купонах: есть 4 типа купонов (равновероятны). Каково E[покупок] до получения всех 4 типов?
Математические рассуждения под давлением интервью
На уровне Staff/Senior Engineer на Google и Meta ожидают умения доказывать корректность алгоритмов, оценивать сложность не только через Big-O, но и через нижние оценки (Omega), и объяснять почему что-то работает математически строго. Это не про заучивание теорем - это про структуру мышления.
**Техники доказательств на интервью:** - **Инвариант цикла (Loop invariant):** что истинно до/во время/после цикла - **Индукция:** если верно для n, покажи для n+1 - **Доказательство от противного:** assume A, derive contradiction - **Pigeonhole principle:** n+1 объектов в n ящиках → хотя бы два в одном - **Двойной подсчёт:** посчитать одно и то же двумя способами
**Как отвечать на «докажите это» на интервью:** 1. Назвать метод доказательства («Воспользуюсь индукцией / противоречием / инвариантом») 2. Чётко сформулировать базовый случай или инвариант 3. Показать шаг индукции или нарушение 4. Подытожить вывод одним предложением Интервьюер проверяет структуру мышления, не идеальность формулировок.
Принцип Дирихле (pigeonhole) - самый частый неожиданный инструмент на интервью. «Докажите, что в строке длиной n+1 над алфавитом {a,...,z^n} есть повторяющийся символ» - pigeonhole. «Докажите, что в любой последовательности n²+1 различных чисел есть монотонная подпоследовательность длины n+1» - тоже pigeonhole (теорема Эрдёша-Секереша).
Почему сортировка сравнениями требует Omega(n log n) сравнений в худшем случае? Какой аргумент корректен?
Ключевые идеи
- **Подсчёт:** C(n,k) для неупорядоченного выбора, P(n,k) для упорядоченного, stars-and-bars для разложений, включения-исключения для ограничений.
- **Двудольность:** граф двудольный ↔ нет нечётных циклов. Проверка BFS за O(V+E). Применение: расписания, matching, 2-раскраска.
- **SCC:** алгоритм Косараю - два DFS + транспонированный граф. Применение: зависимости пакетов, компиляторы.
- **Вероятностные задачи:** задача о купонах E[X]=n·H(n), Монти Холл через байесовское обновление, E[quicksort] через индикаторы.
- **Доказательства:** инвариант цикла, индукция, Дирихле (pigeonhole), двойной подсчёт, нижние оценки через дерево решений.
Связанные темы
Эта тема - финальная точка курса, объединяющая всё в интервью-навыки:
- Discrete Math в CS — NP-полнота и вероятностные алгоритмы - теоретическая база для распознавания типа задачи на интервью
- Случайные величины — E[X] через индикаторы, задача о купонах и анализ quicksort - прямые приложения E[X] и линейности
- Комбинаторика — Формулы подсчёта (C(n,k), stars-and-bars) - фундамент для интервью-задач на подсчёт
Вопросы для размышления
- получили задачу на интервью: «Сколько способов расставить n не бьющих ферзей на доске n×n?». Как за 30 секунд определяете тип задачи и правильный подход?
- Как бы объяснили принцип Дирихле (pigeonhole) без технических терминов, если интервьюер на System Design попросил доказать, что у любой хеш-функции с m выходами есть коллизии при m+1 входах?
- На Staff Engineer интервью в Google звучит вопрос: «Докажите, что данный алгоритм распределения задач по серверам оптимален». Какую математическую технику выбрать и почему?