
- •Структуры и алгоритмы обработки данных
- •Логическая и физическая структуры данных
- •Классификация структур данных
- •Основные операции над структурами данных
- •Алгоритм и примеры задач, решаемых с помощью алгоритмов
- •Адресация и распределение памяти
- •Адресные пространства и модели оперативной памяти
- •Формирование физического адреса в реальном режиме
- •Особенности адресации в защищенном режиме
- •Кэширование
- •Анализ алгоритмов
- •Быстродействие – основной показатель эффективности алгоритма
- •Подсчет числа простейших операций
- •Лучший, средний и худший случаи
- •Алгоритмы и платформы
- •Виртуализация памяти
- •Использование кэша
- •Выравнивание данных
- •Рандомизированные алгоритмы
- •Общая характеристика записей и способы описания в Delphi
- •Многоуровневые записи
- •Выравнивание и упакованные записи
- •Записи с вариантной частью
- •Массивы
- •Общая характеристика массивов
- •Статические (стандартные) массивы
- •Многомерные статические массивы
- •Свойства статических массивов
- •Открытые массивы
- •Динамические массивы
- •Динамические векторы
- •Многомерные динамические массивы
- •Массивы типа Variant
- •Вставка и удаление в массиве
- •Связные списки и алгоритмы их обработки
- •Списки и их разновидности
- •Односвязный список
- •Общая характеристика односвязного списка
- •Структура элемента односвязного списка
- •Формирование односвязного списка
- •Просмотр односвязного списка
- •Вставка элемента в односвязный список
- •Удаление элемента из односвязного списка
- •Линейный двухсвязный список
- •Структура элемента двухсвязного списка
- •Реализация операций в линейном двухсвязном списке
- •Нелинейный двухсвязный список
- •Нелинейный трехсвязный список
- •Определение плекса и его общие признаки
- •Иерархическая списковая структура. Сетевая структура
- •Достоинства и недостатки связных списков
- •Функциональные и свободные списки
- •Общая характеристика функционального и свободного списка
- •Методы формирования свободного списка
- •Стеки, очереди, деки и операции в них
- •Общая характеристика
- •Очередь
- •Динамические множества и словари
- •Общая характеристика
- •Операции в динамических множествах
- •Деревья
- •Общая характеристика и некоторые определения
- •Представление дерева в памяти
- •Естественное представление дерева
- •Представление дерева с помощью вектора
- •Представление дерева с использованием списков сыновей
- •Методы обхода деревьев
- •Бинарное дерево
- •Структура бинарного дерева
- •Формирование бинарного дерева
- •Обход бинарного дерева
- •Преобразование любого дерева к бинарному дереву
- •Включение и исключение в дереве
- •Включение в дереве
- •Исключение в дереве
- •Поиск: определение и общая терминология
- •Линейный (последовательный) поиск
- •Последовательный поиск в упорядоченной таблице
- •Последовательный поиск при накоплении запросов
- •Индексно-последовательный поиск
- •Бинарный поиск
- •Поиск, использующий бинарное дерево
- •Сортировка
- •Общие сведения и некоторые определения
- •Внутренняя сортировка
- •Сортировка прямыми включениями
- •Сортировка бинарными включениями
- •Сортировка прямым выбором
- •Сортировка прямым обменом
- •Сортировка методом Шелла
- •Сортировка с помощью бинарного дерева
- •Пирамидальная сортировка
- •Быстрая сортировка разделением
- •Внешняя сортировка
- •Сортировка прямым слиянием
- •Сортировка естественным слиянием
- •Сортировка многопутевым слиянием
- •Многофазная сортировка
- •Хеширование и хеш-таблицы
- •Общие сведения и определения
- •Коллизии при хешировании
- •Разрешение коллизий при хешировании
- •Разрешение коллизий методом открытой адресации
- •Разрешение коллизий методом цепочек
- •Функции хеширования
- •Поисковые деревья
- •Бинарное дерево поиска
- •Структура бинарного дерева поиска и алгоритм поиска
- •Вставка элемента в бинарное дерево поиска
- •Удаление из бинарного дерева поиска
- •Красно-черные деревья
- •Определение красно-черного дерева, структура его элементов
- •Повороты
Вставка элемента в бинарное дерево поиска
Вставить новую вершину в бинарное дерево поиска довольно просто. С помощью алгоритма поиска, изложенного ранее, отыскивается вершина с одной или двумя нулевыми ссылками left или (и) right. Если ключ вставляемого элемента меньше ключа вершины с нулевой ссылкой left, то эта ссылка направляется к новой вершине, если больше, то к новой вершине направляется ссылка right, если она была нулевой. В результате вставленный элемент оказывается листом (его обе ссылки left и right являются нулевыми). На рисунке 13.2 показан результат вставки в дерево бинарного поиска вершины с ключом 13.
Рисунок 13.2 – Вставка в дерево бинарного поиска элемента с ключом 13. Светлые вершины располагаются на пути от корня к позиции вставки;
пунктиром указана связь, добавляемая при вставке новой вершины
Алгоритм вставки сопряжен с одной проблемой. Хотя алгоритм гарантирует создание допустимого дерева бинарного поиска, после выполнения алгоритма дерево может быть неоптимальным или неэффективным. Пусть в пустое дерево бинарного поиска вставляются элементы с ключами 2, 5, 7, 8. С ключом 2 все просто – он становится ключом корня. Вершины с остальными ключами добавляются в качестве правых дочерних вершин для предшествующих ключей. Результат представляет длинное вытянутое вырожденное дерево, показанное на рисунке 13.3.
Рисунок 13.3 – Вырожденное дерево бинарного поиска
Если бы можно было гарантировать случайный порядок вставки ключей и вершин, или если бы общее количество вершин было очень небольшим, описанный алгоритм вставки оказался бы приемлемым. Однако в общем случае подобную гарантию нельзя дать, поэтому необходимо использовать более сложный метод вставки, частью которого является стремление сбалансировать дерево бинарного поиска. Этот метод балансировки используется в красно-черных деревьях.
Удаление из бинарного дерева поиска
Процедура удаления заданной вершины z из бинарного дерева поиска рассматривает три возможные ситуации. Если у удаляемой вершины нет дочерних вершин, т. е. удаляемая вершина – лист, то у его родителя указатель на z получает значение Nil.
Если у удаляемой вершины z только одна дочерняя вершина, то с помощью «переброски» указателя от родителя вершины z к ее дочерней вершине, как это показано на рисунке 13.4.
Рисунок 13.4 – Удаление из дерева бинарного поиска элемента с ключом 18, который имеет только одну дочернюю вершину. Двойная стрелка указывает на результат выполнения удаления
Если у удаляемой вершины z имеется две дочерних вершины, то определяется следующая за ним вершина s, у которой нет левого сына. Затем все данные, кроме структурных ссылок, из вершины s копируются в поля удаляемого элемента, а вершина s удаляется путем создания новой связи между ее родителем и сыном. Эти преобразования иллюстрируются рисунком 13.5.
Рисунок 13.5 – Удаление из дерева бинарного поиска элемента с ключом 5, который имеет две дочерних вершины. Вершина 6 удаляется, ее данные копируются в слот вершины 5.
В литературных источниках показано, что бинарные деревья поиска высоты h обеспечивают выполнение базовых операций за время О(h). К базовым операциям в данном случае относятся операции поиска, вставки, удаления, определения максимального и минимального ключа и некоторые другие операции
Таким образом, операции выполняются тем быстрее, чем меньше высота дерева. Однако в наихудшем случае, когда при плохом расположении ключей вставляемых вершин дерево приближается к вырождению, эффективность бинарного дерева поиска ничуть не лучше, чем эффективность, которую обеспечивает линейный связный список.