Чек-лист самопроверки
Разработчику
Аналитику
Тестировщику
Архитектору
Инженеру
Чек-лист самопроверки
Общие понятия
- Могу ли я своими словами объяснить, что такое алгоритм?
- Понимаю ли я три ключевых свойства алгоритма: дискретность, определённость, конечность?
- Могу ли я привести пример алгоритма из повседневной жизни и разбить его на шаги?
- Понимаю ли я разницу между алгоритмом и программой?
- Могу ли я объяснить, почему алгоритм должен быть детерминированным?
Анализ сложности
- Понимаю ли я, что означает нотация
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 log n)? - Могу ли я объяснить, в чём разница между сравнительными и несравнительными алгоритмами сортировки?
- Знаю ли я, что такое устойчивая сортировка и когда это важно?
- Могу ли я реализовать бинарный поиск и объяснить его тонкости (переполнение, зацикливание)?
- Понимаю ли я, как искать границы (lower bound, upper bound) с помощью бинарного поиска?
Практическое применение
- Могу ли я определить сложность простого алгоритма, глядя на его код?
- Умею ли я находить скрытую квадратичную сложность (например, вызов линейной функции внутри цикла)?
- Понимаю ли я, когда выгодно сортировать данные перед поиском, а когда — нет?
- Знаю ли я, какие структуры данных обеспечивают
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)?