Полный гид для студентов: стек, очередь, деревья и хеш-таблицы. Поймите, когда какая структура решает задачу быстрее всех.
Структура данных — это способ организовать и хранить данные в памяти компьютера так, чтобы с ними было удобно работать: быстро добавлять, удалять, искать и изменять.
Представьте: у вас тысяча книг. Можно сложить их в кучу на полу — тогда поиск нужной книги займёт вечность. А можно поставить на полку по алфавиту или разложить по жанрам. Структура данных — это и есть «поставить книги на полку». Разная организация подходит для разных задач.
Каждая структура имеет свои сложности операций — O-нотацию. Она показывает, как растёт время выполнения с увеличением объёма данных. O(1) — мгновенно, O(log n) — очень быстро, O(n) — пропорционально объёму.
Правильная структура данных может ускорить программу в тысячи раз. Плохой выбор — замедлить до тормозов. Один и тот же алгоритм на массиве может работать за O(n²), а на хеш-таблице — за O(n).
n — количество элементов. O(1) — время не зависит от n. O(log n) — при увеличении n вдвое время растёт на 1 шаг. O(n) — время растёт пропорционально. O(n²) — при удвоении n время умножается на 4.
Структура данных по принципу Last In — First Out: последний добавленный элемент извлекается первым. Доступ только к верхнему элементу — это делает стек предсказуемым и сверхбыстрым.
💡 Представьте стопку тарелок: кладёте сверху — снимаете сверху. Нижнюю тарелку не достанете, пока не уберёте все верхние.
Принцип First In — First Out: элементы обрабатываются строго в порядке поступления. Первый вошёл — первый вышел. Идеальна для моделирования реальных очередей и обработки задач по порядку.
💡 Как очередь в магазине: кто встал первым — того обслужат первым. Новые люди встают в конец очереди.
Иерархическая структура из узлов, где каждый имеет не более двух потомков. В бинарном дереве поиска (BST) левый потомок меньше родителя, правый — больше. Это даёт быстрый поиск за O(log n).
💡 Как книга с оглавлением: каждый раздел делится на подразделы, каждый подраздел — на пункты. Вы идёте от общего к частному, не перечитывая книгу целиком.
Массив фиксированного размера + хеш-функция, которая превращает ключ в индекс массива. Благодаря этому поиск, добавление и удаление работают в среднем за O(1) — мгновенно.
💡 Как шкаф с пронумерованными ячейками: вы кладёте вещь в ячейку с номером, который высчитывает формула. Чтобы найти — считаете номер снова и сразу идёте туда.
| Структура | Принцип | Доступ | Поиск | Вставка | Удаление | Память |
|---|---|---|---|---|---|---|
| Стек | LIFO | O(1) top | O(n) | O(1) | O(1) | Минимальная |
| Очередь | FIFO | O(1) front | O(n) | O(1) | O(1) | Минимальная |
| Дерево (BST) | Иерархия | O(log n) | O(log n) | O(log n) | O(log n) | Средняя |
| Хеш-таблица | Ключ → Индекс | O(1)* | O(1)* | O(1)* | O(1)* | Высокая |
Каждая структура оптимальна для своей задачи. Спросите себя: что именно вам нужно делать с данными — и ответ подскажет выбор.
«Мне нужен доступ только к последнему элементу» — отмена действий, структура вызовов, обратный обход
«Нужно обработать строго в порядке поступления» — печать, BFS, планировщик задач
«Данные иерархические и нужен быстрый поиск с упорядоченностью» — файловая система, DOM
«Нужен мгновенный доступ по ключу, порядок не важен» — кэш, словарь, индексация
Каждое действие (набор текста, форматирование) записывается в стек. Нажали Ctrl+Z — извлекается последнее действие. Можно отменить всё по порядку.
Сервер получает запросы от пользователей и ставит их в очередь. Обрабатывает по порядку поступления — так обеспечивается справедливость для всех клиентов.
Корневая папка — вершина дерева. Подпапки — ветви. Файлы — листья. Путь C:\Users\Docs\file.txt — это обход от корня к листу.
URL — ключ, HTML-код — значение. При повторном запросе браузер вычисляет хеш URL и мгновенно находит страницу в кэше, не обращаясь к сети.
Поиск в ширину (BFS) использует очередь: сначала изучаем всех соседей текущего узла, потом — их соседей. Находит кратчайший путь в невзвешенном графе.
Браузер превращает HTML-код в дерево объектов (DOM). JavaScript находит, добавляет и удаляет элементы — все манипуляции идут через дерево.
Стек = работа с одним концом (верхом). Очередь = работа с двумя концами (вход и выход). Запомните: стек — «всё с одной стороны», очередь — «вход слева, выход справа».
Хеш-таблица быстрее всех (O(1)), но тратит больше памяти. Дерево сбалансировано — ищет быстро (O(log n)) и экономит память. Выбирайте компромисс.
Когда нужен упорядоченный обход (от меньшего к большему) или диапазонный запрос (все значения между 10 и 50). Хеш-таблица перемешивает данные — упорядоченность теряется.
Запомните: стек и очередь — все основные операции O(1). Дерево (сбалансированное) — O(log n). Хеш-таблица — O(1) в среднем, O(n) в худшем (при коллизиях).