- •Оглавление
- •Введение
- •Раздел 1. Основные структуры данных
- •Тема 1. Введение в структуры данных. Динамическое распределение памяти
- •Классификация структур данных
- •1.2. Переменные-указатели и динамическое распределение памяти.
- •Например, указатели на простейшие базовые типы вводятся следующим образом:
- •Var pStr1,pStr2 :TpString; {переменные-указатели на строки}
- •1.3. Дополнительные вопросы использования переменных-указателей
- •1.4. Контрольные вопросы по теме
- •Тема 2. Структуры данных “стек” и “очередь”
- •2.1. Что такое стек и очередь?
- •2.2. Статическая реализация стека
- •2.3. Динамическая реализация стека
- •{Ссылочный тип для адресации элементов стека}
- •2.4. Статическая реализация очереди
- •2.5. Динамическая реализация очереди
- •{Ссылочный тип для адресации элементов очереди}
- •2.6. Практические задания
- •2.7. Контрольные вопросы по теме
- •Тема 3. Основы реализации списковых структур
- •3.1. Структуры данных типа “линейный список”
- •3.2. Первый способ статической реализации списка.
- •3.3. Второй способ статической реализации списка.
- •3.4. Управление памятью при статической реализации списков
- •3.5. Динамическая реализация линейных списков
- •3.6. Практические задания
- •3.7. Контрольные вопросы по теме
- •Тема 4. Усложненные списковые структуры
- •4.1. Двунаправленные линейные списки
- •4.2. Комбинированные структуры данных: массивы и списки указателей
- •4.3. Комбинированные структуры данных: массивы и списки списков
- •4.4. Практические задания.
- •4.5. Контрольные вопросы по теме
- •Тема 5. Основные понятия о древовидных структурах
- •5.1. Основные определения
- •5.2. Двоичные деревья
- •5.3. Идеально сбалансированные деревья
- •5.4. Практические здания
- •5.5. Контрольные вопросы по теме
- •Тема 6. Реализация поисковых деревьев
- •Двоичные деревья поиска.
- •6.2. Добавление вершины в дерево поиска
- •6.3. Удаление вершины из дерева поиска
- •6.4. Практические задания
- •Контрольные вопросы по теме
- •Тема 7. Дополнительные вопросы обработки деревьев. Графы.
- •Проблемы использования деревьев поиска
- •7.2. Двоичные деревья с дополнительными указателями
- •7.3. Деревья общего вида (не двоичные).
- •Представление графов
- •Практические задания
- •Контрольные вопросы по теме
- •Раздел 2. Алгоритмы сортировки и поиска
- •Тема 1. Классификация методов. Простейшие методы сортировки
- •1.1. Задача оценки и выбора алгоритмов
- •1.2. Классификация задач сортировки и поиска
- •1.3. Простейшие методы сортировки: метод обмена
- •1.4. Простейшие методы сортировки: метод вставок
- •1.5. Простейшие методы сортировки: метод выбора
- •1.6. Практическое задание
- •1.7. Контрольные вопросы по теме
- •Тема 2. Улучшенные методы сортировки массивов
- •2.1. Метод Шелла
- •2.2. Метод быстрой сортировки
- •2.3. Пирамидальная сортировка
- •2.4. Практическое задание
- •2.5. Контрольные вопросы по теме
- •Тема 3. Специальные методы сортировки
- •3.1. Простейшая карманная сортировка.
- •3.2. Карманная сортировка для случая повторяющихся ключей
- •3.3. Поразрядная сортировка
- •3.4. Практическое задание
- •3.5. Контрольные вопросы по теме
- •Тема 4. Поиск с использованием хеш-функций
- •4.1. Основные понятия
- •4.2. Разрешение конфликтов: открытое хеширование
- •4.3. Разрешение конфликтов: внутреннее хеширование
- •4.4. Практические задания
- •4.5. Контрольные вопросы по теме
- •Тема 5. Внешний поиск и внешняя сортировка
- •5.1. Особенности обработки больших наборов данных
- •5.2. Организация внешнего поиска с помощью б-деревьев.
- •5.4. Поиск элемента в б-дереве.
- •5.5. Добавление вершины в б-дерево
- •5.6. Удаление вершины из б-дерева
- •5.7. Внешняя сортировка
- •5.8. Практические задания
- •5.9. Контрольные вопросы по теме
- •Основные термины и понятия
- •Литература
5.5. Контрольные вопросы по теме
В чем состоит основное отличие древовидных структур от списковых?
Как рекурсивно определяется дерево?
Какие типы вершин существуют в деревьях?
Какие можно выделить типы деревьев?
Какие деревья называются двоичными?
Какие деревья называются упорядоченными?
Какие основные понятия связываются с деревьями?
Какие основные операции характерны при использовании деревьев?
Какую структуру имеют вершины двоичного дерева?
Почему для деревьев существует несколько правил обхода вершин?
Какие правила обхода вершин дерева являются основными?
Как выполняется обход дерева в прямом направлении?
Как выполняется обход дерева в симметричном направлении?
Как выполняется обход дерева в обратном направлении?
Как выполняется обход дерева в обратно-симметричном направлении?
Почему рекурсивная реализация правил обхода является наиболее удобной?
Что происходит при рекурсивном выполнении обхода дерева?
Как программно реализуется обход дерева в прямом направлении?
Как программно реализуется обход дерева в симметричном направлении?
Как программно реализуется обход дерева в обратном направлении?
Какой формальный параметр необходим для рекурсивной реализации правил обхода и как он используется?
В чем состоит суть нерекурсивной реализации процедур обхода?
Какая вспомогательная структура данных необходима для нерекурсивной реализации обхода дерева и как она используется?
Опишите схему процедуры для нерекурсивного обхода дерева.
Как выполняется поиск в дереве вершины с заданным ключом?
Как правильно выполнить уничтожение всей древовидной структуры?
Какое дерево называется идеально сбалансированным?
В чем заключается значимость идеально сбалансированных деревьев с точки зрения организации поиска?
Опишите алгоритм построения идеально сбалансированного дерева.
В чем состоит принципиальное отличие алгоритмов обхода деревьев от алгоритма построения идеально сбалансированного дерева?
Почему ссылочный параметр в рекурсивной процедуре построения идеально сбалансированного дерева должен быть параметром-переменной?
Какие формальные параметры должна иметь рекурсивная подпрограмма построения идеально сбалансированного дерева и для чего они используются?
Приведите программную реализацию процедуры построения идеально сбалансированного дерева.
Тема 6. Реализация поисковых деревьев
Двоичные деревья поиска.
Деревья поиска – частный, но практически, пожалуй, наиболее важный вид двоичных деревьев. Будем считать, что каждая вершина имеет некое ключевоеполе, позволяющееупорядочитьмножество вершин. Двоичное дерево называется деревом поиска или поисковым деревом, если длякаждойвершины дерева все ключи в еелевомподдеревеменьшеключа этой вершины, а все ключи в ееправомподдеревебольшеключа вершины.
Пример дерева поиска с целыми ключами представлен на следующем рисунке.
Деревья поиска являются одной из наиболее эффективных структур построения упорядоченныхданных. Как известно, в упорядоченном массиве очень эффективно реализуется поиск (дихотомия!), но очень тяжело выполнить добавление и удаление элементов. Наоборот, в упорядоченном списке легко реализуется добавление и удаление элементов, но не эффективна реализация поиска из-за необходимости последовательного просмотра всех элементов, начиная с первого. Деревья поиска позволяютобъединить преимуществамассивов и линейных списков: легко реализуется добавление и удаление элементов, а также эффективно выполняется поиск.
Эффективность процесса поиска в ДП определяется дихотомической структурой самого дерева. На каждом шаге поиска, начиная с корня, отбрасывается одно из поддеревьев- левое или правое. Двоичный поиск наиболее эффективен для идеально сбалансированных деревьев или близких к ним. В самом плохом случае число сравнений равно высоте дерева. При этом, как и в методе двоичного поиска в упорядоченном массиве, сравнительная эффективность поиска в ДП быстро увеличивается при увеличении числа вершин в этом дереве.
Например, если идеально сбалансированное ДП имеет 1000 вершин, то даже в наихудшем случае потребуется не более 10 сравнений (2 в степени 10 есть 1024), а если число вершин 1 миллион, то потребуется не более 20 сравнений.
Можно сделать следующий вывод: ДП следует использовать для представления упорядоченных данных, когда число их достаточно велико и часто приходится выполнять операции добавления, удаления и поиска.
Интересно заметить, что обход ДП в симметричном порядке позволяет получить исходный набор данных в соответствии с заданным упорядочиванием, а обход в обратно-симметричном порядке – в обратном порядке.
Алгоритм поискав ДП очень прост:
Начиная с корневой вершины для каждого текущего поддерева надо выполнить следующие шаги:
сравнить ключ вершины с заданным значением x
если заданное значение меньше ключа вершины, перейти к левому потомку, иначе перейти к правому поддереву.
Поиск прекращается при выполнении одного из двух условий:
либо если найден искомый элемент
либо если надо продолжать поиск в пустом поддереве, что является признаком отсутствия искомого элемента
Интересно, что поиск очень легко можно реализовать простым циклом, без использования рекурсии:
pCurrent := pRoot; {начинаем поиск с корня дерева}
Stop := false;
While (pCurrent <> nil) and (not Stop) do
if x < pCurrent ^.inf then pCurrent := pCurrent^.left else
if x > pCurrent ^.inf then pCurrent := pCurrent^.right else Stop := true;