Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структуры&АлгоритмыОД2.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
704.51 Кб
Скачать
  1. Специальные виды множеств атд “Дерево двоичного поиска”

Дерево двоичного поиска - структура данных для представления множеств, чьи элементы упорядочены посредством некоторого отношения линейного порядка. На деревьях двоичного поиска можно реализовать операторы множества 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 именно в таком порядке.

Еще одной структурой данных, которая поддерживает словари, являются АВЛ-деревья

  1. Графы

Ориентированные и неориентированные графы – естественная модель отношений между какими-либо объектами.

Ориентированный граф (орграф) G=(V,E) состоит из множества вершин V и множества дуг E. Вершины также называют узлами, а дуги – ориентированными ребрами.

П ример орграфа с 4 вершинами 5 ребрами.

Вершины орграфа можно использовать для представления объектов, а дуги для отношений между объектами. Например, вершины орграфа могут представлять города, а дуги – маршруты полетов самолетов из одного города в другой. Или, другой пример, вершины – блоки операторов программы, а дуги – перемещение потоков данных.

Путем в орграфе называется последовательность вершин v1, v2,…, vn, для которой существуют дуги v1 v2, v2 v3,…, vn-1  vn. Длина пути – количество дуг, составляющих путь. Путь называется простым, если все вершины на нем, за исключением, может быть, первой и последней, различны. Цикл – это простой путь длины не менее 1, который начинается и заканчивается в одной и той же вершине. На рис. вершины 3,2,4,3 образуют цикл длины 3.

Во многих приложениях удобно к вершинам и дугам орграфа присоединить какую-либо информацию. Для этих целей используется помеченный орграф, т.е. орграф, у которого каждая дуга и/или каждая вершина имеет соответствующие метки. Меткой может быть имя, вес, стоимость (дуги), или значение данных какого-либо заданного типа.