Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по СиАОД.doc
Скачиваний:
54
Добавлен:
27.10.2018
Размер:
759.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) mod B.

Например, если мы хотим вставить элемент 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.

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

Меткой может быть имя, вес, стоимость (дуги), или значение данных какого-либо заданного типа.