Алгоритмы и структуры данных
Алгоритмы и структуры данных с нуля: массивы и сортировка, стеки, очереди, списки, рекурсия, деревья, хеш-таблицы, кучи и графы, а также приёмы решения задач — два указателя, скользящее окно, префиксные суммы, динамическое программирование.
Раздел — для тех, кто хочет разобраться в основах алгоритмов и структур данных с нуля и простыми словами. Двадцать две статьи идут от простого к сложному: сначала массивы и сортировка, потом структуры-инструменты, деревья, хеш-таблицы и, наконец, графы. У каждой структуры разбираем, что она делает быстро, что медленно и почему, — и всё это на общей мерке скорости, O-нотации. Читать удобнее по порядку, но каждая статья самодостаточна.
Основы
- Зачем нужны структуры данных и алгоритмы — что это такое, три роли структур, обзор и базовые термины.
- Математика для O-нотации: логарифмы, степени и скорость роста — школьная вспоминалка: степени, логарифмы и как из них читается O(...).
- Массивы, двоичный поиск и O-нотация — самый простой контейнер и то, как измеряют скорость: O(1), O(N), O(log N).
- Простая сортировка: пузырёк, выбор, вставка — три базовых алгоритма O(N²) и чем они отличаются.
Структуры-инструменты
- Стеки и очереди — LIFO и FIFO, дек и приоритетная очередь: доступ намеренно ограничен.
- Связанные списки — узлы и ссылки, быстрая вставка вместо быстрого доступа.
- Рекурсия — метод вызывает сам себя; базовое условие, стек вызовов, «разделяй и властвуй».
Быстрая сортировка
- Нетривиальная сортировка: Шелла, быстрая, поразрядная — как обогнать O(N²) и дойти до O(N·log N) и даже O(N).
Деревья
- Двоичные деревья — быстрый поиск и вставка сразу; обход, удаление, вырождение.
- Красно-чёрные деревья — как удержать баланс автоматически поворотами и перекраской.
- Деревья 2-3-4 и B-деревья — узлы с несколькими ключами; отсюда индексы баз данных.
Хеш-таблицы и кучи
- Хеш-таблицы — доступ по ключу за O(1); коллизии, пробирование, цепочки.
- Пирамиды (кучи) — мгновенный максимум, основа приоритетной очереди и heapsort.
Графы
- Графы — вершины и рёбра; обход в глубину и в ширину, топологическая сортировка.
- Взвешенные графы — минимальный остов и кратчайший путь (алгоритм Дейкстры).
Приёмы решения задач
Структуры — половина дела; вторая половина — узнавать, каким приёмом задача решается. Шесть приёмов закрывают большинство алгоритмических задач.
- Два указателя и скользящее окно — как заменить вложенные циклы одним проходом.
- Префиксные суммы — сумма любого отрезка за O(1) после одного предподсчёта.
- Двоичный поиск по ответу — искать не в данных, а в диапазоне ответов.
- Монотонный стек — вопросы «когда впервые станет больше» за один проход.
- Динамическое программирование — перебор, который не повторяет уже сделанную работу.
- Перебор с отсечением — когда нужны не число, а сами варианты.
Итог
- Как выбрать структуру данных — сводка раздела и практическое руководство, что брать под какую задачу.
Связанное
- Как устроена HashMap внутри — хеш-таблица на конкретном примере из Java.
- Коллекции Java — списки, множества и словари стандартной библиотеки.
- Системный дизайн — где эти структуры встречаются в проектировании больших систем.