Структуры данных
Деревья, стеки, очереди и графы.
6 вопросов
JuniorТеорияОчень частоЧем стек отличается от очереди?
Чем стек отличается от очереди?
Стек работает по LIFO — последним пришёл, первым вышел — добавление и извлечение с одного конца, как стопка тарелок. Очередь работает по FIFO: добавление в конец, извлечение из начала. Обе дают O(1) на вставку и удаление.
Типичные ошибки
- ✗Менять определения местами, называя стек
FIFO, а очередьLIFO - ✗Считать, что очередь извлекает из конца, а не из начала
- ✗Полагать, что обе структуры возвращают элементы в одном порядке
Уточняющие вопросы
- →Как реализовать очередь с помощью двух стеков?
- →Какие реальные задачи естественно ложатся на
LIFOстек?
JuniorТеорияЧастоЧто такое граф?
Что такое граф?
Граф моделирует связи: вершины (узлы) соединены рёбрами, и напрямую связанные вершины — соседи. Он бывает направленным или ненаправленным, взвешенным или невзвешенным; направленное ребро A→B делает B соседом A, но не A соседом B.
Типичные ошибки
- ✗Считать любой граф связным и ацикличным, путая его с деревом
- ✗Забывать, что рёбра могут быть направленными, и соседство может быть односторонним
- ✗Упускать, что рёбра могут нести веса для стоимости или расстояния
Уточняющие вопросы
- →В чём разница между направленным и ненаправленным графом?
- →Как обнаружить цикл в направленном графе?
JuniorТеорияЧастоЧто такое дерево?
Что такое дерево?
Дерево — это связный ацикличный граф: n узлов, соединённых ровно n-1 рёбрами, с единственным путём между любыми двумя узлами. Обычно у него один корень, отношения родитель→потомок идут вниз, и циклов нет.
Типичные ошибки
- ✗Допускать циклы, что превращает структуру в обычный граф
- ✗Забывать, что дерево с
nузлами имеет ровноn-1рёбер - ✗Считать, что дерево может распадаться на независимые компоненты
Уточняющие вопросы
- →Почему дерево с
nузлами всегда имеетn-1рёбер? - →Что отличает двоичное дерево от обычного дерева?
MiddleТеорияЧастоЧто такое двоичное дерево поиска?
Что такое двоичное дерево поиска?
Двоичное дерево, где у каждого узла ≤2 потомка и держится инвариант BST: каждый ключ в левом поддереве меньше, а каждый в правом больше. Это даёт O(log n) на поиск и вставку при балансе, деградируя до O(n) при перекосе в цепочку.
Типичные ошибки
- ✗Игнорировать инвариант порядка и допускать произвольные ключи потомков
- ✗Считать поиск всегда
O(log n)независимо от формы дерева - ✗Позволять узлу
BSTиметь более двух потомков
Уточняющие вопросы
- →Как самобалансирующееся дерево сохраняет гарантии
O(log n)? - →Какой порядок вставки превращает
BSTв цепочкуO(n)?
MiddleТеорияИногдаКак можно представить граф в памяти?
Как можно представить граф в памяти?
Два способа: список смежности, где каждая вершина хранит своих соседей — O(V+E) памяти, удобно для разреженных графов; или матрица смежности, сетка V×V наличия ребра — O(V^2) памяти, зато O(1) на поиск ребра, что подходит плотным графам.
Типичные ошибки
- ✗Путать стоимость памяти: список
O(V+E), матрицаO(V^2) - ✗Думать, что список смежности даёт
O(1)на проверку ребра - ✗Выбирать матрицу для разреженного графа и тратить память
Уточняющие вопросы
- →Когда матрица смежности предпочтительнее списка?
- →Как представление влияет на время
BFSиDFS?
MiddleТеорияИногдаЧто такое куча, и для чего она используется?
Что такое куча, и для чего она используется?
Куча — это полное двоичное дерево со свойством кучи: в min-heap каждый родитель ≤ своих потомков, поэтому минимум в корне. Она лежит в основе очереди с приоритетом с O(log n) на вставку и извлечение минимума и O(1) на просмотр; применяется в Dijkstra.
Типичные ошибки
- ✗Считать, что куча хранит элементы полностью отсортированными, как массив
- ✗Утверждать, что извлечение минимума —
O(1), а неO(log n)после просеивания - ✗Путать кучу с
BSTи его правилом left<root<right
Уточняющие вопросы
- →Как двоичная куча компактно хранится внутри плоского массива?
- →Почему построение кучи из
nэлементов занимаетO(n), а неO(n log n)?