- •Структуры и алгоритмы обработки данных
- •Алгоритмы. Основные определения
- •От задачи к программе
- •Написание программы.
- •Типы данных, структуры данных и абстрактные типы данных
- •Указатели и курсоры
- •Время выполнения программ
- •Измерение времени выполнения программы
- •Степень (порядок) роста
- •Вычисление времени выполнения программ
- •Линейные абстрактные типы данных атд «Список»
- •Реализация списков посредством массивов
- •Реализация списков с помощью указателей
- •Атд «Стек»
- •Атд «Очередь»
- •Реализация очередей с помощью циклических массивов
- •Нелинейные абстрактные типы данных Деревья
- •Порядок узлов
- •Прямой, обратный и симметричный обходы дерева
- •Помеченные деревья и деревья выражений
- •Представление деревьев с помощью массивов
- •Специальные виды множеств атд “Дерево двоичного поиска”
- •Атд "Словарь", основанный
- •Представление ориентированных графов
- •Атд для ориентированных графов
- •Задача нахождения кратчайшего пути
- •Int **c, // массив стоимостей
- •Int *d) // массив кратчайших
- •Остовные деревья минимальной стоимости
- •Обход графов
- •Поиск в ширину
- •Поиск в глубину
- •Сортировка
- •Простые схемы сортировки Метод «пузырька»
- •Сортировка вставками
- •Быстрая сортировка
- •Пирамидальная сортировка
- •«Карманная» сортировка
- •Порядковые статистики
- •Методы разработки алгоритмов. Типы алгоритмов
- •Алгоритмы «разделяй и властвуй» (метод декомпозиции)
- •Баланс подзадач
- •Динамическое программирование
- •Перемножение нескольких матриц
- •Шаг 1: строение оптимальной расстановки скобок
- •Шаг 2: рекуррентное соотношение
- •Шаг 3: вычисление оптимальной стоимости
- •Void MatrixChainOrder(int n, // кол-во матриц
- •Int p[], // размеры матриц
- •Int **s) // оптимальное k
- •Шаг 4: построение оптимального решения
- •Int **s, // таблица, полученная
- •Int I, // индексы
- •Когда применимо динамическое программирование?
- •Оптимальность для подзадач
- •Перекрывающиеся подзадачи
- •«Жадные» алгоритмы
- •"Жадные" алгоритмы как эвристики
- •Когда применим жадный алгоритм?
- •Принцип жадного выбора
- •Оптимальность для подзадач
- •Поиск с возвратом
- •Функции выигрыша
- •Метод ветвей и границ
- •Структуры данных и алгоритмы для внешней памяти
- •Внешняя сортировка
- •Хранение данных в файлах
- •Простая организация данных
- •Хешированные файлы
- •Индексированные файлы
- •Содержание
- •Глава I. Линейные абстрактные типы данных 31
- •Глава II. Сортировка 108
Специальные виды множеств атд “Дерево двоичного поиска”
Дерево двоичного поиска - структура данных для представления множеств, чьи элементы упорядочены посредством некоторого отношения линейного порядка.
На деревьях двоичного поиска можно реализовать операторы множества
INSERT, DELETE, MEMBER, MIN,
причем время их выполнения в среднем имеет порядок O (log2 n) для множеств, состоящих из n элементов.
Характерным для дерева двоичного поиска является то, что его узлы помечены элементами множеств (узлы дерева содержат элементы множества).
Причем, все элементы, хранящиеся в узлах левого поддерева любого узла х, меньше элемента, содержащегося в узле х, а все элементы, хранящиеся в узлах правого поддерева узла х, больше элемента, содержащегося в узле х.
Примеры двоичного дерева:
Основные операции с двоичными деревьями поиска требуют времени O(h), где h – высота дерева.
Поэтому важно знать какова высота «типичного» дерева.
Для этого необходимо принять какие-то статистические предположения о распределении ключей и последовательности выполняемых операций.
В общем случае ситуация трудна для анализа, поэтому будем рассматривать лишь деревья, полученные добавлением вершин без удалений.
Случайным двоичным деревом поиска из n различных ключей называется дерево, получающееся из пустого дерева добавлением этих ключей в случайном порядке (все n! перестановок считаем равновероятными).
Это не означает, что все двоичные деревья равновероятны, так как разные порядки добавления могут приводить к одному и тому же дереву.
Утверждение: Мат. ожидание высоты случайного дерева из n ключей есть O(log2 n).
Для минимизации среднего пути поиска используются сбалансированные деревья двоичного поиска. АВЛ-дерево – это сбалансированное упорядоченное дерево двоичного поиска, у которого для каждого узла высоты его левого и правого поддеревьев отличаются не более, чем на единицу. Названы так в честь авторов Адельсона-Вельского и Ландиса.
Для АВЛ –дерева применяются специальные методы балансировки поддеревьев при вставке и удалении элементов множества. Для этого узлы АВЛ-дерева содержат дополнительный параметр – признак сбалансированности узла.
Пример АВЛ –дерева:
Представление АВЛ-дерева не отличается от представления двоичного дерева поиска.
Другой разновидностью сбаланси-рованного дерева поиска является 2-3 дерево, структура которого отличается от структуры дерева двоичного поиска. Для 2-3 дерева характерно, что все узлы имеют 2 или 3 сына, все пути от корня до листа имеют одинаковую длину и все элементы множества содержатся в листьях.
Узлы 2-3 дерева делятся на внутренние и терминальные (листья). Внутренние узлы используются только для маршрутизации поиска в дереве. Каждый внутренний узел содержит ключи наименьших элементов второго и третьего сына (если есть третий сын) и указатели на узлы сыновей.
Представление связного дерева двоичного поиска:
Представление сбалансированного связного 2-3 дерева: