Алгоритмы — чек-лист
Разработчику
Аналитику
Тестировщику
Архитектору
Инженеру
Чек-лист самопроверки
Общие понятия
- Могу ли я своими словами объяснить, что такое алгоритм?
- Понимаю ли я три ключевых свойства алгоритма — дискретность, определённость, конечность?
- Могу ли я привести пример алгоритма из повседневной жизни и разбить его на шаги?
- Понимаю ли я разницу между алгоритмом и программой?
- Могу ли я объяснить, почему алгоритм должен быть детерминированным?
Анализ сложности
- Понимаю ли я, что означает нотация
O(f(n))? - Могу ли я отличить временнýю сложность от пространственной?
- Знаю ли я, чем отличаются обозначения
O,ΩиΘ? - Могу ли я объяснить, почему в асимптотическом анализе игнорируют константы?
- Понимаю ли я, что
Oописывает поведение при стремленииnк бесконечности?
Основные классы сложности
- Могу ли я привести пример алгоритма с константной сложностью
O(1)? - Понимаю ли я, почему доступ к элементу массива по индексу —
O(1)? - Могу ли я объяснить, как работает бинарный поиск и почему его сложность —
O(log n)? - Могу ли я привести пример задачи, которая требует линейного времени
O(n)? - Понимаю ли я, почему полный перебор всех пар элементов даёт квадратичную сложность
O(n²)? - Знаю ли я, какие алгоритмы имеют сложность
O(n log n)и почему это важный порог? - Могу ли я объяснить, почему экспоненциальные алгоритмы
O(2^n)непрактичны для большихn? - Знаю ли я, когда возникает
O(n³)(например, наивное умножение матриц)? - Могу ли я назвать задачу с
O(√n)илиO(n!)и объяснить разницу сO(2^n)?
Сортировка и поиск
- Могу ли я описать, как работает сортировка вставками и в каких случаях она эффективна?
- Понимаю ли я принцип "разделяй и властвуй" на примере сортировки слиянием?
- Знаю ли я, как устроена быстрая сортировка и какие есть стратегии выбора опорного элемента?
- Понимаю ли я, почему пирамидальная сортировка гарантирует
O(n log n)? - Могу ли я объяснить, в чём разница между сравнительными и несравнительными алгоритмами сортировки?
- Знаю ли я, что такое устойчивая сортировка и когда это важно?
- Могу ли я реализовать бинарный поиск и объяснить его тонкости (переполнение, зацикливание)?
- Понимаю ли я, как искать границы (lower bound, upper bound) с помощью бинарного поиска?
- Знаю ли я, зачем нужен самоорганизирующийся поиск и когда он уместен?
- Понимаю ли я принцип GIGO и проверку предусловий алгоритма?
Графы и ранжирование
- Могу ли я объяснить разницу между вершиной, ребром и весом?
- Понимаю ли я, чем BFS отличается от алгоритма Дейкстры?
- Могу ли я словами описать идею PageRank и степенного метода?
- Знаю ли я критерий существования эйлерова цикла (чётные степени в связном графе)?
- Понимаю ли я разницу между эйлеровым циклом (по рёбрам) и гамильтоновым (по вершинам)?
- Могу ли я объяснить, зачем нужна топологическая сортировка DAG зависимостей?
- Знаю ли я, что такое минимальный остов и чем отличаются идеи Прима и Краскала?
- Знаю ли я, что такое НОД и как работает алгоритм Евклида?
Практическое применение
- Могу ли я определить сложность простого алгоритма, глядя на его код?
- Умею ли я находить скрытую квадратичную сложность (например, вызов линейной функции внутри цикла)?
- Понимаю ли я, когда выгодно сортировать данные перед поиском, а когда — нет?
- Знаю ли я, какие структуры данных обеспечивают
O(1)для поиска, а какие —O(log n)? - Могу ли я объяснить, почему хеш-таблица в среднем даёт
O(1), но в худшем случае —O(n)? - Понимаю ли я, как локальность данных (cache locality) влияет на реальную производительность?
- Знаю ли я, что такое амортизированный анализ и как он применяется к динамическим массивам?
Классы времени выполнения
- Могу ли я объяснить разницу между статической компиляцией, интерпретацией и JIT-компиляцией?
- Знаю ли я, какие языки относятся к нативному классу (A), а какие — к управляемому (B)?
- Понимаю ли я, какие преимущества даёт управляемая среда выполнения (сборка мусора, безопасность)?
- Знаю ли я, какие задачи лучше решать с помощью нативного кода, а какие — с помощью скриптов?
- Понимаю ли я, почему современные JavaScript-движки так быстры, несмотря на интерпретацию?
Инструменты и методы
- Умею ли я использовать профилировщик для измерения производительности своего кода?
- Знаю ли я, как проводить нагрузочное тестирование для проверки масштабируемости?
- Могу ли я объяснить, почему преждевременная оптимизация — это антипаттерн?
- Понимаю ли я, как алгоритмическая сложность влияет на проектирование баз данных (индексы, запросы)?
- Знаю ли я, как избежать проблемы N+1 при работе с базами данных?
Продвинутые темы
- Понимаю ли я, что такое амортизированная сложность и как она применяется?
- Знаю ли я, как работает экспоненциальный поиск в бесконечных последовательностях?
- Могу ли я объяснить, почему Timsort эффективен на частично упорядоченных данных?
- Понимаю ли я, как факторизовать сложность: например,
O(n log n)как комбинацияO(n)иO(log n)? - Знаю ли я, какие существуют методы амортизированного анализа (совокупная оценка, потенциал)?
- Понимаю ли я, как аппаратная архитектура (кэши, NUMA) влияет на выбор алгоритма?
- Могу ли я объяснить, почему некоторые алгоритмы с "худшей" асимптотикой быстрее на малых
n? - Знаю ли я, где в стандартных библиотеках моего языка используются гибридные алгоритмы (Introsort, Timsort)?
Практика на Python
После самопроверки по списку выше закрепите оценку сложности по коду — Big-O — шпаргалка с примерами (вопросы 6–19 в чек-листе выше), затем типовые приёмы готовым кодом — Алгоритмы на Python — ЕГЭ и олимпиадка, Java — консольные задачи или Pascal / Free Pascal — типовые программы — ввод-вывод, сортировка, бинарный поиск; у каждого блока есть разбор и пример входа/выхода.