Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_YaPiMT_ispravlennoe (2).docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
342.66 Кб
Скачать

Метод хеширования.

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

Пусть задан размер таблицы, = n. Тогда можно взять цифровое значение некоторой части кода ключа, как целое число, и разделить его на n. Если позиции занумерованы числами 1,2,…, k, то остаток от деления +1, определяет номер позиции в таблице, соответствующей заданному ключу.

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

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

Например, для таблицы порядка n можно предложить следующую функцию: Выделим из ключа группу в n битов, рассматривая ее как двоичное число, возводим последнее в квадрат и из не результата выделяем опять группу в n битов, которую можно рассматривать как соответствующий адрес+1.

Применение подобных метод требует осторожности, т.к. неудачный выбор группы битов может привести к функциям с неравномерно распределенными значениями.

Рассмотрим следующий пример:

Необходимо построить функцию хеширования имен переменных, используемых в одной программе. Предполагается, что в программе может встречаться не более 100 различных имен. Ключом будут служить первые два символа S1S2; S2 – может быть пробелом, если имя односимвольное. Если имена составляются из букв латинского алфавита и цифр по наиболее часто используемым правилам образования, то различных ключей может быть 26*37 = 962. Для каждого ключа S1S3 – функция хеширования = ((nsi-1)*37+nS2)mod (100) +1 где nsi – номер символа Si, i= в последовательности (A, B, D … x, y,z 0,1, ..,S)

Выражение в скобках для каждого из возможных ключей определяет единственное число в диапазоне от 0 до 99. На каждую позицию в таблице буду претендовать 9-10 значений. Для того, чтобы осуществить указанное преобразования ключа, мы перешли в 37-ричную систему счисления, что дало возможность поставить в однозначное соответствие каждому ключу одно число из интервала целых чисел.

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

Если дан ключ из символов S1,S2 – первые два символа имени. Предполагается, что в программе может встретиться не более 100 различных имён. S2 может быть пробелом, если имя односимвольное f1=(( , где - номер символа Si, i=1,2,…,36 в последовательности (A,B,C,D,…,X,Y,Z,1,2,…,9) 26х37=962(*)

Если имена составляются из букв машинного алфавита и цифр, то различных ключей может быть (*). Для каждого ключа S1,S2 функция хеширования имеет вид f1. Выражение в скобках для каждого из возможных ключей определяет единственное число в диапазоне от 9 до 99. На каждую позицию в таблице будут претендовать 9·10 записей (колизия). Для того, чтобы осуществить указанное преобразование ключа, мы перешли в 37-ричную систему счисления, что дано возможность поставить в однозначное соответствие каждому ключу одно число из интервала целых чисел.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]