Структуры данных: тренировочные вопросы с объяснениями

Бесплатные тестовые вопросы по теме Структуры данных с подсказками и объяснениями, трёх уровней: ключевые термины и факты, применение понятий, кейсы и анализ.

Бесплатная задачаЛёгкая

Что такое свойство max-кучи?

Следующая задача →

Что вы отрабатываете

  1. Лёгкаяключевые термины и факты
  2. Средняяприменение понятий
  3. Сложнаякейсы и анализ

Изучите тему «Структуры данных» с нуля

Перед этим: Алгоритмы и сложность

1Что такое структура данных

Структура данных — это способ организации данных в памяти, при котором определённые операции выполняются быстро: найти элемент, добавить его, удалить.

Нет структуры, которая быстра во всём. Выбрать структуру — значит выбрать, какие операции должны быть дешёвыми. Их стоимость записывают в Big O, где n — число элементов.

Два базовых строительных блока — массив и связный список.

a7[0]3[1]9[2]4[3]7394∅h

Массив хранит элементы в одном блоке памяти, один за другим. Компьютер может вычислить, где находится элемент i, поэтому чтение a[i] занимает O(1). Вставка в начало означает сдвиг каждого элемента: O(n).

Связный список хранит каждый элемент в узле с указателем на следующий узел. Последний указатель равен null. Вставка в голову (h) меняет только один указатель: O(1). Но чтобы добраться до элемента i, нужно пройти i указателей: O(n).

Двусвязный список имеет также указатель на предыдущий узел, поэтому по нему можно идти в обе стороны.

Самопроверка Какая операция выполняется за O(1) для массива, но за O(n) для односвязного списка?
  1. Вставка нового элемента в начало
  2. Однократный обход каждого элемента
  3. Подсчёт элементов по одному
  4. Чтение элемента с индексом i

Ответ: Чтение элемента с индексом i. Массив вычисляет адрес элемента i напрямую. Связному списку нужно пройти i указателей от головы. Вставка в начало — обратный случай: дёшево для списка, дорого для массива.

2Стеки и очереди

Стек похож на стопку тарелок: добавлять и убирать можно только сверху. Последним вошёл — первым вышел: LIFO.

  • push кладёт элемент наверх, pop убирает верхний элемент, peek читает верхний, не убирая его. Все операции выполняются за O(1).
  • Применение: функция отмены в редакторе, стек вызовов программы, проверка баланса скобок, поиск в глубину.

Очередь похожа на очередь у кассы: встают в конец, а уходят из начала. Первым вошёл — первым вышел: FIFO.

  • enqueue добавляет в конец, dequeue убирает из начала. Обе операции выполняются за O(1).
  • Применение: задания печати, сообщения, ожидающие обработки, поиск в ширину.

Дек (двусторонняя очередь) допускает добавление и удаление с обоих концов. Очередь с приоритетом всегда первым убирает элемент с наивысшим приоритетом; обычно её строят на основе кучи.

Самопроверка Какая структура данных лучше всего подходит для кнопки «отменить» в текстовом редакторе?
  1. Граф
  2. Очередь
  3. Стек
  4. Хеш-таблица

Ответ: Стек. Отмена должна сначала обращать последнее действие: последним вошёл — первым вышел. Очередь отменяла бы сначала самое старое действие.

3Деревья, кучи, хеш-таблицы и графы

У дерева есть один верхний узел — корень. У каждого другого узла ровно один родитель. Узлы без потомков — листья. В дереве с n узлами n − 1 рёбер.

В двоичном дереве у каждого узла не более двух потомков. Двоичное дерево поиска (BST) добавляет правило: ключи в левом поддереве меньше ключа узла, ключи в правом поддереве больше.

Поиск в BST идёт по одному пути вниз, поэтому стоит O(высота). Сбалансированное дерево (AVL, красно-чёрное) держит высоту около log₂ n. Ключи, вставленные в отсортированном порядке, образуют цепочку высотой n.

Куча — это двоичное дерево, в котором каждый родитель меньше своих потомков (min-куча) или больше (max-куча). Минимум или максимум находится в корне, а вставка и удаление стоят O(log n).

Хеш-таблица хранит пары «ключ — значение». Хеш-функция превращает ключ в индекс, поэтому вставка и поиск в среднем занимают O(1). Два ключа с одним индексом образуют коллизию, которую решают цепочками (список в каждой ячейке) или открытой адресацией (пробуют другую ячейку).

У графа есть вершины, соединённые рёбрами, которые могут иметь направление или вес. Его хранят в виде матрицы смежности, O(V²) памяти, или списков смежности, O(V + E).

Самопроверка Ключи 50, 30, 70, 20 и 40 вставляются в таком порядке в пустое двоичное дерево поиска. Что является левым потомком узла 30?
  1. 20
  2. 40
  3. 70
  4. У него нет левого потомка

Ответ: 20. 20 меньше 50, поэтому идёт влево к 30. Оно также меньше 30, поэтому снова идёт влево. 40 больше 30 и становится его правым потомком.

4Метод по шагам

Вопросы часто описывают задачу и спрашивают, какая структура подходит, или спрашивают, как выглядит структура после некоторых операций.

  1. Найдите операцию, которая должна быть быстрой: доступ по позиции, по ключу, к новейшему элементу, к самому старому, к наименьшему или к диапазону.
  2. Сопоставьте её со структурой: индекс → массив, ключ → хеш-таблица, новейший → стек, самый старый → очередь, наименьший или наибольший → куча, отсортированный порядок или диапазоны → сбалансированное дерево поиска.
  3. Проверьте в Big O стоимость остальных операций, нужных для задачи.
  4. Для вопроса на трассировку выполняйте операции по одной и записывайте состояние после каждой.
  5. Сверьте итоговое состояние с правилом структуры: LIFO, FIFO, порядок BST или порядок кучи.

5Разобранный пример

Пройдите каждый шаг. Попробуйте предсказать следующий, прежде чем открыть его.

Разобранный пример

Ключи 50, 30, 70, 20, 40 и 60 вставляются в таком порядке в пустое двоичное дерево поиска. Каков симметричный обход и сколько сравнений нужно для поиска 60?

1

Вставьте корень

Первый ключ, 50, становится корнем.

2

Вставьте 30 и 70

30 меньше 50, поэтому идёт налево. 70 больше 50, поэтому идёт направо.

503070
3

Вставьте 20, 40 и 60

20: меньше 50, меньше 30, значит, слева от 30. 40: меньше 50, больше 30, значит, справа от 30. 60: больше 50, меньше 70, значит, слева от 70.

503070204060
4

Обойдите симметрично

Симметричный обход посещает левое поддерево, затем узел, затем правое поддерево.

Получается 20, 30, 40, 50, 60, 70: ключи в отсортированном порядке, как это всегда бывает для BST.

5

Найдите 60

Сравните с 50: больше, идём вправо. Сравните с 70: меньше, идём влево. Сравните с 60: найдено.

503070204060

Поиск требует 3 сравнений, по одному на уровень.

Ответ

Симметричный обход: 20, 30, 40, 50, 60, 70. Поиск 60 требует 3 сравнений.

6Типичные ошибки

  • Путать LIFO и FIFO. Стек возвращает новейший элемент, очередь — самый старый.
  • Думать, что связный список даёт быстрый доступ по индексу. Ему приходится идти от головы.
  • Считать, что BST всегда работает за O(log n). Это верно только для сбалансированного дерева; вставка отсортированных ключей даёт O(n).
  • Забывать о коллизиях в хеш-таблице. O(1) — это в среднем, а не в худшем случае.
  • Путать обходы. Прямой: сначала узел. Симметричный: узел посередине. Обратный: узел последним.
  • Использовать матрицу смежности для большого разреженного графа. Она впустую тратит O(V²) памяти.
Самопроверка Вы помещаете в пустую очередь 1, 2 и 3 именно в таком порядке. Какой элемент вернёт первый dequeue?
  1. 1, 2 и 3 вместе
  2. 1
  3. 2
  4. 3

Ответ: 1. Очередь работает по принципу «первым вошёл — первым вышел», поэтому первым уходит 1. 3 было бы ответом для стека (pop), который возвращает новейший элемент.

7Как выглядят экзаменационные задачи

  • Лёгкая: ключевые термины и факты. LIFO и FIFO, что такое узел, корень или лист, правило BST, что делает хеш-функция.
  • Средняя: применение понятий. Какая структура подходит для задачи, результат push и pop или вставок в BST, обходы деревьев, хеш-таблица с линейным пробированием, стоимость в Big O.
  • Сложная: случаи и анализ. Сбалансированные деревья, кучи в массивах, B-деревья, префиксные деревья (tries), система непересекающихся множеств (union-find), фильтры Блума и конструкции вроде LRU-кеша.

Для кучи, хранящейся в массиве с индекса 0, потомки элемента с индексом i находятся на позициях 2i + 1 и 2i + 2, а его родитель — на ⌊(i − 1) / 2⌋.

Изучайте шаг за шагом в приложенииИзучайте шаг за шагом в приложении

Примеры вопросов

Пример 1Лёгкая

В чём главное отличие статического массива от динамического?

  1. AСтатический массив даёт более медленный доступ по индексу
  2. BДинамический массив может расти, переходя в больший блок памяти
  3. CДинамический массив хранит свои элементы в связанных узлах, поэтому может расти по одному элементу
  4. DСтатический массив может хранить только числа
Показать подсказки
  1. Списки Python и ArrayList в Java — примеры одного из них.
  2. Два неверных ответа теперь зачёркнуты. Один из двух оставшихся верный.
Показать ответ и объяснение

Почему это ответ

Статический массив имеет фиксированный размер; динамический массив при заполнении выделяет массив побольше и копирует туда элементы.

Ответ

B · Динамический массив может расти, переходя в больший блок памяти
Пример 2Средняя

Как работает extract-min в двоичной min-куче?

  1. AУдаляют последний элемент массива
  2. BПоследний элемент перемещают в корень и опускают вниз (sift down)
  3. CУдаляют корень и сдвигают все элементы на одну позицию влево
  4. DИщут новый минимум среди всех листьев
Показать подсказки
  1. Сохраните полноту дерева, затем исправьте порядок.
  2. Два неверных ответа теперь зачёркнуты. Один из двух оставшихся верный.
Показать ответ и объяснение

Почему это ответ

Последний элемент заполняет «дыру» в корне и меняется местами с меньшим потомком, пока не выполнится свойство кучи; это занимает O(log n).

Ответ

B · Последний элемент перемещают в корень и опускают вниз (sift down)
Пример 3Сложная

Какова стоимость одной операции find в худшем случае в структуре union-find с n элементами без объединения по рангу и сжатия путей?

  1. AO(1)
  2. BO(α(n))
  3. CO(log n)
  4. DO(n)
Показать подсказки
  1. Деревья могут вырождаться.
  2. Два неверных ответа теперь зачёркнуты. Один из двух оставшихся верный.
Показать ответ и объяснение

Почему это ответ

Наивные объединения могут связать деревья в длинную цепочку, и find придётся пройти n − 1 указателей на родителя; две эвристики приближают стоимость к константе.

Ответ

D · O(n)

Вопросы и ответы

Структуры данных: что это?

Нет структуры, которая быстра во всём. Выбрать структуру — значит выбрать, какие операции должны быть дешёвыми. Их стоимость записывают в Big O, где n — число элементов.

Два базовых строительных блока — массив и связный список.

Структуры данных: как изучить шаг за шагом?
  1. Что такое структура данных
  2. Стеки и очереди
  3. Деревья, кучи, хеш-таблицы и графы
  4. Метод по шагам
  5. Разобранный пример
  6. Типичные ошибки
  7. Как выглядят экзаменационные задачи
Структуры данных: что вы тренируете?
  • Лёгкая: ключевые термины и факты
  • Средняя: применение понятий
  • Сложная: кейсы и анализ

У каждого вопроса четыре варианта ответа, и только один правильный. Застряли? Сначала откройте небольшую подсказку, а полное объяснение — только когда оно понадобится.

Как проходят занятия

  • У каждого вопроса четыре варианта ответа, и только один правильный.
  • Застряли? Сначала откройте небольшую подсказку, а полное объяснение — только когда оно понадобится.
  • Ваш прогресс, ошибки и сохранённые задачи остаются, поэтому перед экзаменом вы сможете всё повторить.

Темы до и после этой

Сначала изучите

Курсы с этой темой

Другие темы: Информатика

Лист заданий для печати