Структура данных — это способ организации, хранения и управления данными в памяти компьютера, который обеспечивает эффективный доступ и модификацию данных. Выбор правильной структуры данных критически важен для оптимизации производительности алгоритмов.
Элементы располагаются последовательно друг за другом.
Массив (Array)
Фиксированный размер, элементы одного типа, доступ по индексу.
const arr: number[] = [1, 2, 3];
Связный список (Linked List)
Элементы (узлы) связаны через указатели. Бывают односвязные и двусвязные.
interface Node<T> {
value: T;
next?: Node<T>;
}
Стек (Stack)
LIFO (Last In, First Out). Основные операции: push
и pop
.
const stack: number[] = [];
stack.push(1); // Добавление
stack.pop(); // Удаление
Очередь (Queue)
FIFO (First In, First Out). Основные операции: enqueue
и dequeue
.
const queue: number[] = [];
queue.push(1); // Добавление в конец
queue.shift(); // Удаление из начала
Элементы связаны сложными отношениями (иерархия, сеть и т.д.).
Дерево (Tree)
Иерархическая структура с корневым узлом и потомками. Пример: бинарное дерево.
interface TreeNode<T> {
value: T;
left?: TreeNode<T>;
right?: TreeNode<T>;
}
Граф (Graph)
Набор вершин и рёбер. Бывают направленные и ненаправленные.
type Graph = Record<string, string[]>;
const graph: Graph = { A: ['B', 'C'] };
Хеш-таблица (Hash Table)
Ключ-значение с быстрым доступом через хеш-функцию.
const map = new Map<string, number>();
map.set('key', 123);
Множество (Set)
Хранит уникальные значения без порядка.
const set = new Set<number>([1, 2, 2]); // {1, 2}
Куча (Heap)
Специализированное дерево для реализации очередей с приоритетом.
Структуры данных делятся на линейные (массивы, списки, стеки, очереди) и нелинейные (деревья, графы). Выбор структуры зависит от задачи: