- •Введение
- •1. Технология проектирования и реализации коллекций данных.
- •1.1. Постановка задачи.
- •1.2. Разработка структур данных и алгоритмов
- •1.3. Кодирование
- •1.4. Отладка и тестирование
- •1.5. Сопровождение
- •2. Лабораторная работа «Сортировка коллекции»
- •2.1. Алгоритмы внутренней сортировки
- •2.2. Задание к лабораторной работе
- •2.1.1. Варианты заданий
- •2.1.2. Методические указания к выполнению задания
- •2.3. Контрольные вопросы и упражнения.
- •3. Лабораторная работа «Коллекция данных - список».
- •3.1. Структуры списков
- •3.2. Задание к лабораторной работе
- •3.2.1. Варианты заданий:
- •3.2.2. Методические указания к выполнению задания
- •3.3. Контрольные вопросы и упражнения.
- •4. Лабораторная работа «Коллекция данных - дерево поиска».
- •4.1. Структуры bst - деревьев
- •4.2. Задание к лабораторной работе
- •4.2.1. Варианты задания
- •4.2.2. Методические указания к выполнению задания:
- •4.3. Контрольные вопросы и упражнения.
- •5. Лабораторная работа «Коллекция данных - сбалансированное дерево поиска»
- •5.1. Структуры сбалансированных деревьев
- •5.2. Задание к лабораторной работе
- •5.2.1. Варианты заданий:
- •5.2.2. Методические указания к выполнению задания
- •5.3. Контрольные вопросы и упражнения.
- •6. Лабораторная работа «Коллекция данных - хеш – таблица»
- •6.1. Функции хеширования
- •6.2. Разрешение коллизий и структуры хеш-таблиц
- •6.3. Трудоёмкость операций
- •6.4. Задание к лабораторной работе
- •6.4.1. Варианты заданий:
- •6.4.2. Методические указания к выполнению задания
- •6.5. Контрольные вопросы и упражнения.
- •Литература
- •Приложение a: Псевдокод. Основные правила и соглашения псевдокода
- •Алгоритм сортировки Шелла
- •Алгоритм пирамидальной сортировки
- •Рекурсивный алгоритм сортировки разделением
- •Итеративный алгоритм сортировки разделением
- •Рекурсивный алгоритм сортировки слиянием
- •Итеративный алгоритм сортировки слиянием
- •Рекурсивный алгоритм поразрядной msd-сортировки
- •Итеративный алгоритм поразрядной lsd-сортировки
- •Итеративный алгоритм вставки элемента в bst – дерево
- •Рекурсивный алгоритм удаления элемента из bst – дерева
- •Алгоритм вставки элемента в корень bst – дерева
- •Алгоритм поиска предыдущего по значению ключа узла bst – дерева
- •Алгоритм поиска k –го по значению ключа узла в bst – дереве
- •Алгоритм разбиения дерева на части
- •Алгоритм удаления из bst-дерева на основе объединения поддеревьев
- •Алгоритм объединения bst – деревьев
- •Алгоритм удаления элемента из рандомизированного дерева
- •Алгоритм вставки элемента в avl-дерево
- •Рекурсивный алгоритм вставки элемента в rb – дерево
- •Итеративный алгоритм вставки элемента в rb – дерево
- •Итеративный алгоритм удаления элемента из rb – дерева
- •Алгоритм вставки элемента в 2-3 - дерево
- •Алгоритм удаления элемента из 2-3 - дерева
- •Приложение д Алгоритмы операций для хеш-таблицы с открытой адресацией Алгоритм вставки элемента
- •Алгоритм удаления элемента
- •Алгоритм поиска элемента
4.1. Структуры bst - деревьев
Для хранения BST-деревьев используются две альтернативные структуры – массив элементов дерева и связная структура дерева на базе адресных указателей.
Массив элементов
используется в случае, если задано
предельное количество элементов (размер
дерева), которые будут размещены в
BST-дереве.
В этом случае для хранения дерева
выделяется массив заданного размера,
тип которого совпадает с типом элементов
множества, хранящегося в дереве. Корень
дерева размещается в элементе массива
с индексом 0, а его левый и правый сыновья
– с индексом 1 и 2 соответственно. По
индексу любого элемента легко вычислить
индексы его сыновей и родителя в массиве.
Если некоторый элемент имеет индекс i,
то его левый сын расположен по индексу
2i+1,
а правый сын – по индексу 2i+2.
Индекс родителя вычисляется, как целая
часть от деления (i-1)/2
(рис.17).
Рис. 17. Схема размещения BST-дерева в массиве.
Как видно из примера, приведенного на рис. 15, хранение дерева приводит к неэффективному использованию памяти массива. Поэтому использовать массив рекомендуется для хранения полных деревьев, в которых каждый узел имеет двух сыновей.
Наиболее распространённой формой для хранения деревьев является связная структура на базе адресных указателей. Каждый узел дерева размещается в динамической памяти и содержит помимо ключа и данных два указателя на левого и правого сыновей. Таким образом, структура через указатели на сыновей обеспечивает спуск по дереву от корня к местоположению узла с заданным значением ключа. Для некоторых операций требуется подъём от некоторого узла к родительскому узлу и далее к корню. Для этого в структуру узла можно ввести дополнительный указатель на родителя. Но это приводит к неоправданным затратам памяти на дополнительные указатели в узлах. Поэтому эти указатели используются только в отдельных разновидностях деревьев. Как правило, естественное поведение алгоритма операции, обеспечивает возврат по ранее пройденному пути в дереве.
В дерево вводится вспомогательный указатель, содержащий адрес корневого узла. Если дерево пусто, то указатель содержит значение nil (рис. 18).
Р ис. 18. Связная структура BST-дерева.
4.2. Задание к лабораторной работе
-
Спроектировать, реализовать и провести тестовые испытания АТД «BST-дерево» для коллекции, содержащей данные произвольного типа. Тип коллекции задаётся клиентской программой.
Двоичное дерево поиска (Binary Search Tree – BST) представляет упорядоченное, иерархическое, ассоциативное множество элементов, между которыми существуют структурные отношения «предки – потомки».
Интерфейс АТД «BST-дерево» включает следующие операции:
-
опрос размера дерева,
-
очистка дерева,
-
проверка дерева на пустоту,
-
доступ к данным с заданным ключом,
-
включение данных с заданным ключом,
-
удаление данных с заданным ключом,
-
обход узлов дерева по схеме, заданной в варианте задания,
-
дополнительная операция, заданная в варианте задания.
-
итератор для доступа к данным в дереве с операциями:
-
установка на первый узел в дереве с минимальным ключом,
-
установка на последний узел в дереве с максимальным ключом,
-
проверка состояния итератора,
-
доступ по чтению и записи к данным текущего узла в дереве,
-
переход к следующему по значению ключа узлу в дереве,
-
переход к предыдущему по значению ключа узлу в дереве,
Для тестирования коллекции интерфейс АТД «BST – дерево» включает дополнительные операции:
-
вывод структуры дерева на экран,
-
опрос числа просмотренных операцией узлов дерева.
-
Выполнить отладку и тестирование всех операций АТД «BST-дерево» с помощью меню операций.
-
Выполнить тестирование средней трудоёмкости операций поиска, вставки и удаления элементов для вырожденного и случайного BST-дерева.
-
Провести сравнительный анализ экспериментальных показателей трудоёмкости операций.
-
Составить отчёт по лабораторной работе. Отчёт должен содержать следующие пункты:
-
пункты 1 – 5 (см. раздел 2.2),
-
описание методики тестирования трудоёмкости операций,
-
таблицы и графики с полученными оценками трудоёмкости операций для вырожденного и случайного BST-дерева. Должны быть приведены графики среднего числа пройденных узлов для операций поиска, вставки и удаления (графики совмещены в одной системе координат),
-
сравнительный анализ теоретических и экспериментальных оценок трудоёмкости для операций BST-дерева,
-
сравнительный анализ экспериментальных оценок трудоёмкости для различных операций BST-дерева,
-
пункты 10 – 12 (см. раздел 2.2),