Системное программное обеспечение. Лабораторный практикум - страница 20

Шрифт
Интервал


должно быть максимально близко к величине HASH_MAX – HASН_МIN + 1. В данном случае диапазон содержит 223 элемента, и поскольку 223 – простое число, то возьмем Н>2 = 223 (если бы размер диапазона не был простым числом, то в качестве Н>2 нужно было бы взять ближайшее к нему меньшее простое число). В качестве H>1 возьмем 127: H>1 = 127.

Опишем соответствующие константы:

REHASH1 = 127;

REHASH2 = 223;


Тогда хэш-функция с учетом рехэширования будет иметь следующий вид:

>function VarHash(const sName: string; iNum: integer):longint;

>begin

>Result:=(Ord(sName[1])+Ord(sName[(Length(sName)+1) div 2])

>+ Ord(sName[Length(sName)]) – HASH_MIN

>+ iNum*REHASH1 mod REHASH2)

>mod (HASH_MAX-HASH_MIN+1) + HASH_MIN;

>if Result < HASH_MIN then Result:= HASH_MIN;

>end;

Входные параметры этой функции: sName – имя хэшируемого идентификатора, iNum – индекс рехэшированиея (если iNum = 0, то рехэширование отсутствует). Строка проверки величины результата (Result < HASH_MIN) добавлена, чтобы исключить ошибки в тех случаях, когда на вход функции подается строка, содержащая символы вне диапазона 0 ..'z' (поскольку контроль входных идентификаторов отсутствует, это имеет смысл).

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

(Ord(0 )+Ord(0 ))..(Ord('z')+Ord('z'))

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

Без применения рехэширования эта хэш-функция будет выглядеть значительно проще, чем описанная выше хэш-функция с учетом рехэширования:

>function VarHash(const sName: string): longint;

>begin

>Result:=(Ord(sName[1])+Ord(sName[(Length(sName)+1) div 2])

>– HASH_MIN) mod (HASH_MAX-HASH_MIN+1) + HASH_MIN;

>if Result < HASH_MIN then Result:= HASH_MIN;

>end.

Описание структур данных таблиц идентификаторов

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