Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мтодичкаСАОД13.docx
Скачиваний:
129
Добавлен:
11.05.2015
Размер:
1.65 Mб
Скачать
  1. Построение словарей на основе хеширования данных

2.1. Открытое хеширование данных

Существует множество способов повышения эффективности работы с большими объемами информации. Например, для ускорения доступа к данным в таблицах можно использовать предварительное упорядочивание таблицы в соответствии со значениями ключей. При этом могут быть использованы методы поиска в упорядоченных структурах данных, что существенно сокращает время поиска данных по значению ключа. Однако при добавлении новой записи требуется переупорядочить таблицу. Потери времени на повторное упорядочивание справочника часто превышают выигрыш от сокращения времени поиска. Рассмотрим способы организации данных, лишенные указанного недостатка. Это – различные формы хеширования данных.

На рис. 2.1 показана базовая структура данных при открытом хешировании. Основная идея метода заключается в том, что множество данных (возможно, очень большое) разбивается на конечное число классов. ДляВклассов, пронумерованных от0доВ-1, строится хеш-функцияhтакая, что для любого элементаx исходного множества функцияh(x)принимает целочисленное значение из интервала0, …,В-1, которое соответствует классу, которому принадлежит элементx. Элементxназывают ключом,h(x)– хеш-значениемх, а классы – сегментами. Массив (таблица сегментов), проиндексированный номерами сегментов0, 1, … В-1, содержит заголовки дляВ списков. Элементх i-го списка – это элемент исходного множества, для которогоh(x)=i.

Рис. 2.1 Организация данных при открытом хешировании

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

Идеальной хеш-функцией является такая, которая для любых двух неодинаковых ключей выдает неодинаковые адреса, т.е.

Однако подобрать такую функцию можно в случае, если все возможные значения ключей известны заранее. Такая организация данных носит название «совершенное хеширование». Если заранее не определено множество значений ключей, и длина таблицы ограничена, подбор совершенной функции затруднителен. Поэтому часто используют хеш-функции, которые не гарантируют выполнение условия (1).

Рассмотрим хеш-функцию, определенную на символьных строках, которая не является совершенной, однако значенияh(x)будут «хорошими». Идея построения этой функции заключается в том, чтобы представить символы в виде целых чисел, используя для этого машинные коды символов. В языкеPascalесть встроенная функцияord(c), которая возвращает целочисленный код символас. Таким образом, еслих– это ключ, тип данных ключей определен как строка символов, тогда можно использовать хеш-функцию, код которой приведен ниже. В этой функции суммируются все целочисленные коды символов, результат суммирования делится наBи берется остаток от деления, который будет целым числом из интервала от 0 доB-1.

Пример 1. Хеш-функция, определенная на символьных строках

Program hesh;

Var

i,B : integer;

s : string[10];

{Хеш-функция с возвращаемым значением типа Integer}

Function h(x : string[10]): integer;

Var i, sum: integer;

Begin

sum:=0;

Ffor i:=1 to 10 do

sum:=sum+ord(x[i]);

h:=sum mod B; {Возвращаемое значение}

End;

{Вызывающая программа}

Begin

Writeln ('Введите число классов В');

Readln(B);

Writeln ('Введите ключ');

Readln (S);

Writeln (h(s));

End.