Методички / Лаб_6_Структуры данных (1)
.docxЛабораторная работа №6: Структуры данных
Цель работы:
Изучить основные линейные структуры данных, рассмотреть различия между абстрактными типами данных и их реализациями, научиться реализовывать структуры данных на языке Python и сравнивать их по поддерживаемым операциям и эффективности выполнения типовых действий.
Задание 1. Динамический список на основе массива
Рассматривается задача хранения и обработки последовательности целых чисел в памяти. Необходимо реализовать список на основе массива переменной длины. В такой реализации следует использовать две основные характеристики структуры: capacity — емкость массива и size — текущее количество элементов. При нехватке места необходимо создавать новый массив большего размера, копировать в него существующие данные и продолжать работу уже с новым массивом.
Требуется реализовать следующие операции:
добавление элемента в конец списка;
вставка элемента по индексу;
удаление элемента по индексу;
получение элемента по индексу;
получение текущего размера списка.
Для проверки работы структуры используйте следующую последовательность операций:
добавить в пустой список значения 5, 0, 1, 7, 9, 4, 6, 2, 1;
вставить значение 8 по индексу 7;
удалить элемент по индексу 5;
вывести итоговое содержимое списка и его размер.
После выполнения необходимо объяснить, почему получение элемента по индексу в массиве выполняется эффективно, а вставка и удаление требуют сдвига части элементов. Также необходимо сделать вывод о том, чем статический массив отличается от динамического массива и почему для реализации списка на основе массива требуется отдельно хранить size и capacity.
Примечание: при нехватке места создавайте массив в 2 раза больше предыдущего
Задание 2. Односвязный список
Рассматривается задача реализации динамической структуры данных, элементы которой хранятся не подряд в памяти, а в виде цепочки узлов. Каждый узел односвязного списка должен содержать данные и ссылку на следующий узел. Необходимо реализовать односвязный список и основные операции работы с ним.
Требуется реализовать следующие методы:
добавление значения в начало списка;
добавление значения в конец списка;
удаление первого элемента;
удаление последнего элемента;
получение значения по индексу;
получение размера списка.
Для тестирования необходимо создать список, последовательно добавить в него значения 5, 3, 5, 20, затем добавить значение 7 в конец списка, удалить первый элемент, удалить последний элемент (при удалении последнего элемента нам не нужно хранить tail, храним только head) и вывести итоговую последовательность.
После выполнения необходимо объяснить, в чём состоят преимущества и недостатки односвязного списка по сравнению с массивом, почему добавление и удаление в начале списка выполняются просто, а получение элемента по индексу требует последовательного прохода по узлам. Также необходимо сделать вывод о том, какую роль играет указатель head.
Задание 3. Стек на основе связанного списка
Рассматривается задача реализации стека — абстрактного типа данных, работающего по принципу LIFO («последним пришёл — первым вышел»). Необходимо реализовать стек на основе односвязного списка (используйте список из задания 2).
Требуется реализовать следующие операции стека:
push — добавление элемента в вершину стека;
pop — получение элемента с удалением;
peek — получение элемента без удаления;
size — получение количества элементов в стеке.
Для тестирования выполните последовательность действий: поместить в стек значения 5, 0, 1, 7, 9, затем вывести верхний элемент без удаления, удалить два элемента, снова вывести верхний элемент и определить итоговый размер стека.
После выполнения необходимо объяснить, почему стек на основе связанного списка удобно реализовывать через операции добавления и удаления из головы списка, а также сделать вывод о том, какие операции в такой реализации выполняются за константное время.
Задание 4. Сравнение массива и связанного списка
Необходимо провести небольшое вычислительное исследование и сравнить между собой две структуры данных: динамический список на основе массива и односвязный список. Исследование должно показать, как различаются эти структуры по затратам на основные операции.
Требуется экспериментально сравнить следующие действия:
добавление элемента в конец;
удаление элемента из начала;
получение элемента по индексу;
получение размера структуры.
Для эксперимента рекомендуется использовать размеры входных данных:
N = 10^2;
N = 10^3;
N = 10^4.
Допускается выполнять каждую операцию несколько раз с последующим усреднением времени. Результаты следует представить в виде таблицы или графика.
После выполнения необходимо объяснить, почему массивы оказываются особенно удобными для индексного доступа, а связанные списки — для операций добавления и удаления элементов без сдвига большого числа значений. Итогом задания должен стать вывод о том, в каких случаях лучше использовать массив, а в каких — связанный список.
Контрольные вопросы:
1. Что такое структура данных?
2. Чем абстрактный тип данных отличается от структуры данных?
3. Какие структуры называют статическими, а какие динамическими?
4. Что такое массив и какие операции он поддерживает?
5. Почему получение элемента массива по индексу считается эффективной операцией?
6. Что такое список как абстрактный тип данных?
7. В чём различие между списком на основе массива и связанным списком?
8. Что такое односвязный список?
9. Какие преимущества и недостатки имеет односвязный список по сравнению с массивом?
10. Что такое стек и по какому принципу он работает?
11. Какие операции поддерживает стек?
12. Почему стек удобно реализовывать на основе связанного списка?
13. Что такое очередь и по какому принципу она работает?
14. Какие операции поддерживает очередь?
15. Почему связанные списки требуют дополнительной памяти?
16. Как выбрать подходящую структуру данных для конкретной задачи?
