Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка Делфи 2007 год часть 2.pdf
Скачиваний:
29
Добавлен:
11.05.2015
Размер:
953.43 Кб
Скачать

ТЕМА 9. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ ХЕШИРОВАНИЯ

Цель лабораторной работы: получить навыки программирования алгоритмов с использованием хеширования.

9.1. Понятие хеширования

Имеется следующая проблема: поиск данных в списке:

а) если данные расположены беспорядочно в массиве (линейном списке, файле), то осуществляют линейный поиск его эффективность 0(n/2);

б) если имеется упорядоченный массив ( или двоичное дерево), то возможен двоичный поиск с эффективностью 0(log2n).

Однако при работе с двоичным деревом и упорядоченным массивом затруднены операции вставки и удаления элементов, дерево разбалансируется, и требуется балансировка. Что можно придумать более эффективное?

Придумали алгоритм хеширования (hashing – перемешивание), при котором ключи данных записываются в хеш-таблицу. При помощи некой функции i=h(key) алгоритм хеширования определяет положение искомого элемента в таблице по значению его ключа.

Алгоритм хеширования реализуется следующим образом.

Допустим, имеется набор n записей с ключами в диапазоне 0 key K, n < K . Выберем M немного большим, чем n.

Создадим массив (хеш-таблицу):

H: array[0..M-1] of <тип записей>;

Вначале его очистим H[i]:=0 и наши n записей помещаем в этот массив в соответствии со значением ключа и функции i=h(key), 0 i M 1. Затем, используя операторы

zp:=H[h(key)]; // Извлекаем из массива H[h(key)]:=zp; // Записываем в массив

Функция h(key) называется функцией расстановки, или хеш-функцией.

Ввиду того, что число возможных значений ключа K обычно значительно превосходит возможное количество записей K>>М, любая функция расстановки может для нескольких значений ключа давать одинаковое значение позиции i в таблице. В этом случае i=h(key) только определяет позицию, начиная с которой нужно искать запись с ключом key. Поэтому схема хеширования должна включать алгоритм разрешения конфликтов, определяющий порядок действий, если позиция i=h(key) оказывается занятой записью с другим ключом.

41