Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа_5-6.docx
Скачиваний:
3
Добавлен:
24.09.2019
Размер:
90.49 Кб
Скачать

Хеширование

Существует два вида хеширования: открытое (внешнее) – это когда множества хранятся в потенциально бесконечном пространстве; и закрытое (внутреннее) – это если используется ограниченное пространство для хранения множеств.

Идея открытого хеширования заключена в следующем. Множество разбивается на конечное число классов. Для B классов, которые пронумерованы от 0 до B-1, строится хеш-функция h(x), принимающая значение из интервала от 0 до B-1, соответствующее классу, которому принадлежит элемент x. Элемент x – это ключ, а h(x) – это хеш-значение x, а классы - сегменты. Организация данных при открытом хешировании имеет вид связных списков. Массив называется таблицей сегментов и проиндексирован номерами сегментов от 0 до B-1 и содержит заголовки для B списков. Реализация словарей посредством открытой хеш-таблицы представлена на рисунке 5.1.

Как видно из рисунка 5.1, таблица сегментов храниться в массиве. Поле element содержит значения, а поле next содержит указатели на следующие элементы сегментов. Другими словами эта конструкция напоминает массив начальных указателей списков, число которых равно числу сегментов.

При закрытом хешировании в таблице сегментов хранятся элементы словаря, а не заголовки списков. В каждом сегменте может храниться только один элемент словаря. При таком хешировании применяется методика повторного хеширования. Сформулируем его принцип. Если возникает попытка поместить элемент x в сегмент с номером h(x), который уже занят другим элементом (коллизия), то выбирается последовательность других номеров сегментов h1(x), h2(x), ..., куда можно поместить элемент x. Местоположения последовательно проверяются, пока не будет найдено свободное. Если свободных мест нет, то таблица уже заполнена, и элемент x вставить нельзя. Структура закрытой хеш-таблицы выполняется с использованием массива большого размера (рис. 5.7), в котором элементы расположены в разнобой. Поиск элемента в хеш-таблице напоминает последовательный поиск среди расположенных в разнобой элементов массива, порядок которых устанавливается полем next. Это поле хранит индекс следующего элемента таблицы.

Метод хеширования широко применяется в реализации словарей.

Реализация словаря, добавление элемента, поиск элемента по заданному ключу.

public class Example

{

public static void Main()

{

List<string> slovar = new List<string>();

Console.WriteLine("\nДанные словаря о животных:", slovar.Capacity);

slovar.Add("Cat");

slovar.Add("Dog");

slovar.Add("Duck");

slovar.Add("Sheep");

slovar.Add("Zebra");

slovar.Add("Cow");

slovar.Add("Rabbit");

slovar.Add("Chicken");

slovar.Add("Horse");

Console.WriteLine();

foreach (string dinosaur in slovar)

{

Console.WriteLine(dinosaur);

}

Console.WriteLine("\nКоличество записей в словаре: {0}", slovar.Count);

Console.WriteLine("\nПоиск записи Cat: {0}",

slovar.Contains("Cat"));

Console.WriteLine("\nДобавление записи: Frog");

slovar.Insert(0, "Frog"); // вставляем во вторую позицию элемент "Compsognathus"

Console.WriteLine("\nЗапись добавлена!");

foreach (string dinosaur in slovar)

{

Console.WriteLine(dinosaur);

}

Console.WriteLine("\nКоличество записей в словаре: {0}", slovar.Count);

Console.ReadLine();

}

}