Алгоритмы и структуры данных
Алгоритмы и структуры данных с нуля: массивы, списки, деревья, хеш-таблицы, графы и приёмы решения задач. Разбираем, что работает быстро, что медленно и почему.
Раздел — для тех, кто хочет разобраться в основах алгоритмов и структур данных с нуля и простыми словами. Двадцать две статьи идут от простого к сложному: сначала массивы и сортировка, потом структуры-инструменты, деревья, хеш-таблицы и, наконец, графы. У каждой структуры разбираем, что она делает быстро, что медленно и почему, — и всё это на общей мерке скорости, 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 — списки, множества и словари стандартной библиотеки.
- Системный дизайн — где эти структуры встречаются в проектировании больших систем.