
- •Структуры и алгоритмы обработки данных
- •Алгоритмы. Основные определения
- •От задачи к программе
- •Написание программы.
- •Типы данных, структуры данных и абстрактные типы данных
- •Указатели и курсоры
- •Время выполнения программ
- •Измерение времени выполнения программы
- •Степень (порядок) роста
- •Вычисление времени выполнения программ
- •Линейные абстрактные типы данных
- •Атд «Список»
- •Реализация списков посредством массивов
- •Реализация списков с помощью указателей
- •Атд «Стек»
- •Атд «Очередь»
- •Р еализация очередей с помощью циклических массивов
- •Нелинейные абстрактные типы данных
- •Деревья
- •Порядок узлов
- •Прямой, обратный и симметричный обходы дерева
- •Помеченные деревья и деревья выражений
- •Представление деревьев с помощью массивов
- •Специальные виды множеств атд “Дерево двоичного поиска”
- •Атд "Словарь", основанный на хеш-таблицах
- •Представление ориентированных графов
- •Атд для ориентированных графов
- •Задача нахождения кратчайшего пути
- •Остовные деревья минимальной стоимости
- •Обход графов
- •Поиск в ширину
- •Поиск в глубину
- •Сортировка
- •Простые схемы сортировки Метод «пузырька»
- •Сортировка вставками
- •Быстрая сортировка
- •Пирамидальная сортировка
- •«Карманная» сортировка
- •Порядковые статистики
- •Методы разработки алгоритмов. Типы алгоритмов
- •Алгоритмы «разделяй и властвуй» (метод декомпозиции)
- •Баланс подзадач
- •Динамическое программирование
- •Перемножение нескольких матриц
- •Шаг 1: строение оптимальной расстановки скобок
- •Шаг 2: рекуррентное соотношение
- •Шаг 3: вычисление оптимальной стоимости
- •Шаг 4: построение оптимального решения
- •Когда применимо динамическое программирование?
- •Оптимальность для подзадач
- •Перекрывающиеся подзадачи
- •«Жадные» алгоритмы
- •"Жадные" алгоритмы как эвристики
- •Когда применим жадный алгоритм?
- •Принцип жадного выбора
- •Оптимальность для подзадач
- •Поиск с возвратом
- •Функции выигрыша
- •Метод ветвей и границ
- •Структуры данных и алгоритмы для внешней памяти
- •Внешняя сортировка
- •Хранение данных в файлах
- •Простая организация данных
- •Хешированные файлы
- •Индексированные файлы
Специальные виды множеств атд “Дерево двоичного поиска”
Дерево двоичного поиска - структура данных для представления множеств, чьи элементы упорядочены посредством некоторого отношения линейного порядка. На деревьях двоичного поиска можно реализовать операторы множества INSERT, DELETE, MEMBER и MIN, причем время их выполнения в среднем имеет порядок O (log n) для множеств, состоящих из п элементов.
Характерным для дерева двоичного поиска является то, что его узлы помечены элементами множеств (узлы дерева содержат элементы множества). Причем, все элементы, хранящиеся в узлах левого поддерева любого узла х, меньше элемента, содержащегося в узле х, а все элементы, хранящиеся в узлах правого поддерева узла х, больше элемента, содержащегося в узле х.
Примеры двоичного дерева:
Основные операции с двоичными деревьями поиска требуют времени O(h), где h – высота дерева. Поэтому важно знать какова высота «типичного» дерева. Для этого необходимо принять какие-то статистические предположения о распределении ключей и последовательности выполняемых операций. В общем случае ситуация трудна для анализа, поэтому будем рассматривать лишь деревья, полученные добавлением вершин без удалений. Случайным двоичным деревом поиска из n различных ключей называется дерево, получающееся из пустого дерева добавлением этих ключей в случайном порядке (все n! перестановок считаем равновероятными). Это не означает, что все двоичные деревья равновероятны, так как разные порядки добавления могут приводить к одному и тому же дереву. Утверждение: Мат. ожидание высоты случайного дерева из n ключей есть O(log n).
Для минимизации среднего пути поиска используются сбалансированные деревья двоичного поиска. АВЛ-дерево – это сбалансированное упорядоченное дерево двоичного поиска, у которого для каждого узла высоты его левого и правого поддеревьев отличаются не более, чем на единицу. Названы так в честь авторов Адельсона-Вельского и Ландиса. Для АВЛ –дерева применяются специальные методы балансировки поддеревьев при вставке и удалении элементов множества. Для этого узлы АВЛ-дерева содержат дополнительный параметр – признак сбалансированности узла.
Пример АВЛ –дерева:
Представление АВЛ-дерева не отличается от представления двоичного дерева поиска.
Другой разновидностью сбалансированного дерева поиска является 2-3 дерево. Структура 2-3 дерева отличается от структуры дерева двоичного поиска. Для 2-3 дерева характерно, что все узлы имеют 2 или 3 сына, все пути от корня до листа имеют одинаковую длину и все элементы множества содержатся в листьях. Узлы 2-3 дерева делятся на внутренние и терминальные (листья). Внутренние узлы используются только для маршрутизации поиска в дереве. Каждый внутренний узел содержит ключи наименьших элементов второго и третьего сына (если есть третий сын)и указатели на узлы сыновей.
Представление связного дерева двоичного поиска:
Представление сбалансированного связного 2-3 дерева:
Атд "Словарь", основанный на хеш-таблицах
Словарь – множество, предназначенное для хранения "текущих" объектов с периодической вставкой или удалением некоторых из них. Время от времени также возникает необходимость узнать, присутствует ли конкретный элемент в данном множестве.
Словарь реализуется с помощью хеш-таблицы. Существует две формы хеширования:
открытое (внешнее) хеширование – позволяет хранить множества в потенциально бесконечном пространстве, снимая тем самым ограничения на размер множества
закрытое (внутреннее) хеширование использует ограниченное пространство для хранения данных, следовательно и размер множеств ограничен.
1. Представление словаря с помощью открытой хеш-таблицы
Таблица строится на основе следующей идеи: потенциальное множество элементов (возможно, бесконечное) разбивается на конечное число классов. Для В классов, пронумерованных от 0 до В -1, строится хеш-функция h такая, что для любого элемента х исходного множества функция h(x) принимает целочисленное значение из интервала 0, ..., В - 1, которое, соответствует классу, которому принадлежит элемент х. Элемент х часто называют ключом, h(x) — хеш-значением х, а "классы" – сегментами.
Массив, называемый таблицей сегментов и проиндексированный номерами сегментов 0, 1,...,В - 1, содержит заголовки для В связных списков. Элемент x i-го списка — это элемент исходного множества, для которого h(х) = i.
2. Представление словаря с помощью закрытой хеш-таблицы
В таблице сегментов хранятся непосредственно элементы словаря. Поэтому в каждом сегменте можно хранить только один элемент словаря. При закрытом хешировании применяется методика повторного хеширования. При попытке поместить элемент x в сегмент с номером h(x), который уже занят другим элементом (такая ситуация называется коллизией), выбирается другая последовательность номеров сегментов h1(x), h2(x), … , куда можно поместить элемент х. Последовательно проверяется занятость каждого из этих сегментов, пока не будет найден свободный сегмент. В него помещается элемент x. Если свободных сегментов нет, то таблица заполнена и элемент х вставить нельзя. Для задания номеров сегментов при повторном хешировании применяются различные методы разрешения коллизий. Например, метод линейного хеширования, метод середины квадрата, метод случайного хеширования.
Пример. Предположим, что В=8 и ключи a,b,c,d имеют хеш-значения h(a)=3, h(b)=0, h(c)=4, h(d)=3. Применим простую методику, которая называется линейным хешированием hi(x)=(h(x)+i)modB. Например, если мы хотим вставить элемент d, а сегмент 3 уже занят, то надо проверить на занятость сегменты 4,5,6,7,0,1,2 именно в таком порядке.
Еще одной структурой данных, которая поддерживает словари, являются АВЛ-деревья
Графы
Ориентированные и неориентированные графы – естественная модель отношений между какими-либо объектами.
Ориентированный граф (орграф) G=(V,E) состоит из множества вершин V и множества дуг E. Вершины также называют узлами, а дуги – ориентированными ребрами.
П
ример
орграфа с 4 вершинами 5 ребрами.
Вершины орграфа можно использовать для представления объектов, а дуги для отношений между объектами. Например, вершины орграфа могут представлять города, а дуги – маршруты полетов самолетов из одного города в другой. Или, другой пример, вершины – блоки операторов программы, а дуги – перемещение потоков данных.
Путем в орграфе называется последовательность вершин v1, v2,…, vn, для которой существуют дуги v1 v2, v2 v3,…, vn-1 vn. Длина пути – количество дуг, составляющих путь. Путь называется простым, если все вершины на нем, за исключением, может быть, первой и последней, различны. Цикл – это простой путь длины не менее 1, который начинается и заканчивается в одной и той же вершине. На рис. вершины 3,2,4,3 образуют цикл длины 3.
Во многих приложениях удобно к вершинам и дугам орграфа присоединить какую-либо информацию. Для этих целей используется помеченный орграф, т.е. орграф, у которого каждая дуга и/или каждая вершина имеет соответствующие метки. Меткой может быть имя, вес, стоимость (дуги), или значение данных какого-либо заданного типа.