
- •Оглавление
- •Введение
- •Раздел 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. Контрольные вопросы по теме
- •Основные термины и понятия
- •Литература
7.2. Двоичные деревья с дополнительными указателями
Классические двоичные деревья и, в частности, деревья поиска, в каждой вершине имеют по две ссылки на левого и правого потомка. В некоторых практических задачах удобно использовать деревья, вершины которых содержат большеечисло ссылок. Одной из разновидностей подобных деревьев являются деревья с дополнительными указателями народительскиевершины.
В таком дереве каждая вершина имеет дополнительное поле – указатель на своего родителя. Описание соответствующей структуры данных:
TypeTp = ^TNode;
TNode = record
Inf : <описание>;
Left, right, parent : Tp;
end;
Parent
= nil Инф.
часть left right
Parent Инф.
часть left right
Parent Инф.
часть nil right
Parent Инф.
часть nil nil
Parent Инф.
часть nil nil
Parent Инф.
часть nil nil
Преимуществом такого дерева является простота реализации прохода по дереву как вниз, так и вверх, что напоминает двунаправленный список.
Недостатками являются:
Увеличение затрат памяти на поддержку в каждой вершине дополнительного указателя (4 байта на вершину), т.е. в каждой вершине 12 байт занимает служебная информация, что при большом числе вершин (сотни тысяч) может стать весьма ощутимым
Увеличивается число операций при добавлении и удалении вершин за счет поддержки дополнительных ссылочных полей
Использование таких деревьев позволяет упростить процедуры обработки деревьев, прежде всего – обхода и удаления вершин. Отпадает необходимость явного использования рекурсии или ее замены стековыми операциями, поскольку возврат от текущей вершины к ее родителю можно выполнить непосредственно по дополнительному ссылочному полю.
7.3. Деревья общего вида (не двоичные).
Особенность таких деревьев – заранее неизвестноечисло потомков вершин, что не позволяет объявить в каждой вершине какое-то разумное количество ссылочных полей.
Подобные деревья используются реже двоичных, но тем не менее есть круг задач, где они необходимы. Существует несколько способов описания подобных деревьев, например – представление их через набор двоичных деревьев. Другой способ использует понятие сложной списковой структуры. Сначала создаётся основнойлинейныйсписок, содержащий всевершины-родители(не терминальные). С каждой родительской вершиной дополнительно связываетсясписок ее потомков.
1 2 3 4 5 6 7 8 10 11 12 9 |
1 3 4 7 2 3 4 5 6 7 8 9 10 11 12 |
Исходное недвоичное дерево |
Представление в виде списка списков |
Поскольку любая вершина исходного дерева может быть как в основном списке родителей, так и в списке потомков, структура элементов всех списков должна быть одинаковой. Каждая вершина в этой структуре должна иметь информационное поле и два ссылочных поля: указатель на следующий элемент в родительском списке и указатель на следующий элемент списка потомков. В зависимости от присутствия вершины в том или ином списке некоторые поля могут быть пустыми.
Type Tp = ^ TNode;
TNode = record
Inf : <описание>;
NextParent, NextChild : Tp;
end;
В списках потомков ссылочное поле NextParentв простейшем случае просто не используется (устанавливается вnil). Как вариант, можно в этом поле хранить указатель на одноименную вершину в родительском списке.
4 Par Child
1 Par Child
3 Par Child
7 nil Child
2 nil Child
5 nil Child
9 nil nil
10 nil Child
3 Par Child
6 nil Child
11 nil Child
4 Par nil
7 Par Child
12 nil nil
8 Par nil
Схематично рассмотрим реализацию основных операций с подобным списковым представлением недвоичных деревьев.
Вывод списка родителей с соответствующими списками потомков реализуется двойным циклом: внешний цикл идет по списку родителей, а внутренний позволяет для каждого родителя вывести список его потомков
PCurrentParent := pRoot;
While pCurrentParent <> nil do
begin
“обработка вершины pCurrentParent^”;
pCurrentChild := pCurrentParent^.NextChild;
while pCurrentChild <> nil do
begin
“обработка вершины pCurrentChild^”;
pCurrentChild := pCurrentChild^.NextChild;
end;
pCurrentParent := pCurrentParent^.NextParent;
end;
Добавление вершины X как потомка вершины Y:
“поиск вершины Y обходом всех вершин”;
if “вершина Y найдена в списке родителей” then “добавляем X в список потомков вершины Y”;
if “вершина Y найдена в списке потомков” then
“добавляем Y в список родителей”;
“создаем у вершины Y список потомков с вершиной X”;
Удаление вершины X, если она не корневая для всего дерева:
“поиск вершины X обходом всех вершин”;
if “вершина X найдена в списке родителей” then
“просмотром всех списков найти родителя вершины X”;
“удалить X из списка потомков”;
“к родителю X добавить список всех потомков X”;
if “вершина X есть только в списке потомков” then
“удалить X из списка потомков”;
if “список потомков пуст, то удалить родителя из списка родителей”;