Сложность вычислений

Complexity на собеседовании

Собеседование в Amazon на L6: интервьюер просит распределить 200 batch-задач по 100 серверам с минимальным makespan. Junior пишет жадный алгоритм за 5 минут. Senior за 5 минут говорит 'это NP-трудно, сведение к Partition' и обсуждает 2-approximation алгоритм Грэхема. Разница в зарплате - $80k/год.

  • **Google Maps** для маршрутизации использует ALT (A* + landmarks + triangle inequality) - эвристика поверх Dijkstra, ускоряющая запросы в 1000x
  • **Netflix** решает задачу распределения контента по CDN-нодам как mixed-integer programming в Gurobi - подход вместо рукописных эвристик
  • **OpenAI** train scheduling для GPU-кластера использует ILP-solver - формулирует задачу как линейные ограничения, не пишет алгоритм сам

Сведения (reductions)

На собеседовании в Google интервьюер просит распределить рекламные показы по серверам так, чтобы суммарная нагрузка была минимальна. Задача звучит конкретно, но опытный кандидат сразу узнаёт **bin packing** - классическую NP-трудную задачу. Этот рефлекс - 'свести знакомую сложную задачу к новой' - и есть суть **reductions**: формального преобразования A в B такого, что решение B даёт решение A.

Существуют два типа сведений. **Polynomial-time reduction (A ≤_p B)** - 'B не легче A': если есть полиномиальный алгоритм для B, есть и для A. **Karp reduction** - частный случай для decision problems. Если 3-SAT сводится к задаче X за полиномиальное время, то X тоже NP-трудна. На собеседовании важно не доказывать сведение строго, а **показать структурную аналогию**: 'это та же задача о покрытии множеств, только переменные называются по-другому'.

**Сведение vs алгоритм**: реальное собеседование редко требует написать сведение код-в-код. Достаточно показать, что задача 'эквивалентна по сложности' известной NP-трудной - и предложить approximation или heuristic.

Кандидат говорит: 'Эта задача сводится к коммивояжёру'. Что это означает с точки зрения сложности?

Доказательства NP-трудности

На собеседовании на принципала Amazon задают: 'У вас 100 серверов с разной мощностью и 200 batch-задач. Минимизируйте время завершения последней задачи'. Кандидат, который сразу пишет жадный алгоритм - junior. Кандидат, который говорит: 'Это makespan scheduling, NP-трудно, докажу сведением от Partition' - senior. NP-трудность не блокирует решение, она блокирует ожидание оптимального решения.

Канонический шаблон доказательства NP-трудности: (1) Выбрать известную NP-трудную задачу X. (2) Описать преобразование экземпляра X в экземпляр вашей задачи Y за полиномиальное время. (3) Доказать эквивалентность: X имеет решение тогда и только тогда, когда Y имеет решение. На собеседовании достаточно сделать шаги 1 и 2 неформально; полное доказательство займёт 20 минут.

**Канонический набор сведений** для собеседования: 3-SAT, Vertex Cover, Independent Set, Clique, Hamiltonian Path, Subset Sum, Partition, TSP, Bin Packing, Graph Coloring. Знание этих 10 задач покрывает 90% случаев.

Кандидат доказал NP-трудность задачи. Какой следующий шаг ожидает интервьюер?

Дизайн алгоритмов после hardness

TSP NP-трудна, но Google Maps строит маршруты по 100 городам за секунды. Knapsack NP-трудна, но любой ML-движок решает её на feature selection. Реальные NP-трудные задачи решаются - вопрос только какой ценой. На собеседовании важно владеть **арсеналом подходов**: 2-approximation, FPTAS, branch-and-bound, LP relaxation, эвристики (greedy, simulated annealing, beam search), ILP-solvers.

**Approximation algorithms** дают гарантированный фактор от оптимума за полиномиальное время. **FPTAS (Fully Polynomial-Time Approximation Scheme)** - даже сильнее: за O(poly(n, 1/ε)) находит решение с гарантией (1+ε)·OPT. **Parameterized algorithms (FPT)** работают экспоненциально только по одному параметру k (например, по размеру vertex cover), а не по n. На малых k - это практичные алгоритмы.

**Что ответить, если интервьюер давит**: 'Какой будет апроксимационный фактор?'. Знание классических результатов: Vertex Cover - 2-approx, TSP - 1.5 (метрический), Set Cover - ln(n), Knapsack - FPTAS, Bin Packing - 11/9 + O(1).

Задача: маршрут робота на 50 точек в евклидовой плоскости. NP-трудна (TSP). Какой подход выбрать на собеседовании?

Компромиссы (time/space/approximation)

Кандидат на собеседовании в FAANG предлагает hash table за O(1). Интервьюер: 'А память?'. O(n) - но в реальной системе с миллиардом ключей это 100 ГБ RAM. Кандидат должен видеть **компромиссы**: time vs space, exact vs approximate, throughput vs latency, fairness vs efficiency. NP-трудность - частный случай, но даже в P-задачах компромиссы решают всё.

Классический пример - **Bloom filter**: жертвует точностью (false positives) ради 10x экономии памяти и O(1) checks. **Approximate counters (HyperLogLog)** считают unique users в стриме с погрешностью 2% за 16 КБ вместо ГБ HashSet. **Probabilistic data structures** - целый класс структур для компромисса space-vs-accuracy.

**Принцип на собеседовании**: всегда задавать уточняющий вопрос про bounds и SLO. 'Сколько уникальных значений? Какой допустимый error rate? Какая память доступна?' - это перевод задачи из абстрактной в конкретную, что отличает senior от junior.

NP-трудность означает, что задачу нельзя решить на практике.

NP-трудность означает, что нет полиномиального оптимального алгоритма; approximation, heuristics и FPT-алгоритмы решают такие задачи на реальных данных.

Реальные данные не worst-case. Branch-and-bound для TSP с 1000 городов работает за минуты благодаря структуре. Сложность - про worst-case, а production - про average-case.

Интервьюер просит детектор повторных email-адресов из стрима. SLO: <1% false positives. Какую структуру выбрать?

Ключевые идеи

  • **Reductions** - инструмент распознавания: задача сводится к TSP/Knapsack/SAT? значит, в NP-трудных
  • **Hardness-доказательство** на собеседовании - не формальное, а структурная аналогия с канонической задачей за 2 минуты
  • **Арсенал после hardness**: approximation (Christofides 1.5x для TSP), FPTAS для Knapsack, ILP-solvers (Gurobi, CPLEX) для произвольных задач
  • **Probabilistic structures (Bloom, HLL)** - компромисс точность vs память: 0.8% погрешности ценой 500 000x экономии
  • Главный сигнал senior: задаёт уточняющие вопросы про SLO и bounds, переводит абстрактную задачу в конкретную

Связанные темы

Возвращаясь к собеседованию в FAANG: умение распознать NP-трудность и предложить approximation - граница между junior и senior. Эта тема связана с:

  • P, NP и классы сложности — База для понимания NP-трудности; без неё reductions становятся механическим упражнением без смысла
  • Approximation алгоритмы — Конкретные техники (LP-relaxation, primal-dual, дерандомизация) для построения approximation с гарантиями

Вопросы для размышления

  • На реальном собеседовании времени 45 минут. Сколько уделить hardness-доказательству, а сколько - алгоритму? Где проходит граница 'достаточно' для интервьюера?
  • Если задача NP-трудна, но интервьюер ожидает 'оптимальный' ответ - что это: проверка на знание сложности или ожидание брутфорса для маленьких n? Как распознать намерение?
  • Современные ML-методы (GNN-based combinatorial optimization) решают TSP лучше Christofides на конкретных распределениях данных. Меняет ли это подход к собеседованиям через 5 лет?

Связанные уроки

  • cplx-04 — P vs NP - базовый вопрос для решения задач на собеседовании
  • cplx-07 — NP-полные задачи часто встречаются в задачах на интервью
  • alg-22-backtracking — Бэктрекинг - стандартный инструмент для NP-задач на интервью
  • alg-01-big-o — Big O - основной язык анализа на техническом интервью
Complexity на собеседовании

0

1

Войти