Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Презентации 2часть / Лекция_30_Хеширование.ppt
Скачиваний:
27
Добавлен:
11.05.2015
Размер:
183.81 Кб
Скачать

Тема 7. ХЕШИРОВАНИЕ

Понятие хешированияСхема хеширования

Хеш-таблица на основе

массива связанных списков

Обзор других способов

хеширования

07/02/19

1

предпосылки

Имеется глобальная проблема: поиск данных в списке.

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

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

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

Какую организацию данных можно придумать, чтобы поиск был более эффективен ?

07/02/19

2

Идея алгоритма хеширования

Хеширование (hashing-перемешивание) состоит в том, что ключи данных записываются в так называемую хеш-таблицу (массив).

Идея в том, что при помощи некой простой функции i=h(key)

 

алгоритм хеширования определяет положение (индекс) искомого

 

элемента в таблице по значению его ключа.

 

Допустим, имеется набор n записей с ключами в диапазоне

 

0 key K, n<K.

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

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

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

 

zp:=H[key];

//извлекаем из массива

 

 

H[key]:=zp;

//записываем в массив

3

 

07/02/19

 

 

Как видим, все изумительно просто и

 

быстро, эффективность О(n0),

 

однако есть одно но!!!

 

Хорошо если ключи располагаются от 1 до 100. А

 

если это номер страховой карточки с 9 значащими

 

цифрами? Потребуется массив из 109 ячеек!!! Для

 

одного города с миллионным населением в этом

 

массиве будет использоваться только 0,1% ячеек, что

 

абсолютно неприемлемо.

 

Чтобы все-таки использовать этот изящный

 

способ и придумывают различные схемы

 

хеширования, т.е. установление такой

 

функциональной связи между значением ключа key и

 

местоположением записи в некотором массиве, при

 

котором размер таблицы был бы пропорционален

 

количеству записей, а не величине ключа

07/02/19

4

Схема хеширования

Выберем М - предельный размер массива записей H несколько больший чем n (n<M).

Позиции в массиве будем нумеровать начиная с 0:

H:array[0..M] of <тип информации>

Задача состоит в том, чтобы подобрать функцию i=h(key), которая по возможности равномерно отображает значения ключа key на интервал [0..M].

Чаще всего используют i=key mod M. В этом случае если K=M реализуется идеальная расстановка

элементов в хеш-таблице.

07/02/19

5

Хеш-функция

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

Ввиду того, что число возможных значений ключа K обычно значительно превосходит возможное количество записей K>>n, любая функция расстановки может для нескольких значений ключа давать одинаковое значение позиции i в таблице.

Например, если M=10 то для key=1, key=11 и key=101 позиция i=h(key)= key mod M =1.

В этом случае h(key) только определяет позицию, начиная с которой нужно искать запись с ключом key.

07/02/19

6

Алгоритм разрешения конфликтов

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

Имеется множество схем хеширования различающихся как выбором удачной функции h(key) так и алгоритма разрешения конфликтов.

Эффективность решения реальной практической задачи будет существенно зависеть от выбираемой стратегии разрешения конфликтов.

07/02/19

7

Алгоритм размещения записей

вхеш-таблицу

содержит следующие действия:

сначала ключ key очередной записи отображается на позицию i=h(key) таблицы

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

если занята то отрабатывается алгоритм разрешения конфликтов, который находит место для размещения данного элемента.

07/02/19

8

Алгоритм поиска

сначала находит по ключу позицию i=h(key) в таблице,

и если ключ не совпадает H[i].key<>key

то последующий поиск осуществляется в

соответствии с алгоритмом разрешения конфликтов начиная от позиции i.

07/02/19

9

Если ключ не число?

Часто ключами являются не числа, а последовательность букв (строки).

При выборе функции i=h(key) важно, чтобы ее значения вычислялись как можно проще и быстрее.

Поэтому символьные ключи обычно заменяют целыми числами из некоторого диапазона.

Например, если key - слово, то суммой кодов первых 2х-3х букв, если фраза (Ф.И.О.), то сумма кодов первых букв.

При реализации алгоритма разрешения конфликтов поиск ведут уже по полному слову.

07/02/19

10