Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Адресация данных с использованием методов перемешивания (хеширования)
Адресация данных с использованием методов перемешивания (синонимы — методы хеширования, рассеянной памяти, случайного доступа) в настоящее время является наиболее распространенным вариантом построения адресных функций, использующих в качестве аргумента значение ключа записи. Известная всем аббревиатура RAM, приводимая всюду при указании характеристик памяти персональных ЭВМ, означает Random Access Memory — память случайного доступа. Заметим, что название метода вполне удачно (от англ. hash — путаница, мешанина) и весьма точно характеризует идею метода. Основная идея хеш-адресации заключается в том, что каждый экземпляр хранимой записи размещается в памяти по адресу, вычисляемому по значению первичного ключа записи с помощью некоторой адресной функции (хеш-функции), использующей 224 алгоритмы рандомизации. Чтобы запомнить экземпляр записи, необходимо вычислить адрес хранения и поместить запись по этому адресу; при поиске, наоборот: вычисляется адрес хранения и счи-тьтвается запись. Следовательно, необходимо разработать специальную функцию, рационально распределяющую память и удовлетворяющую некоторым требованиям. Рассмотрим требования, предъявляемые к хеш-функциям. Пусть требуется адресовать if записей. При этом условии хеш-функция h должна: 1) иметь не более М разных значений и удовлетворять следу О < h(k) < М - 1 для любого к из К, т. е. для всего множества значений ключа К, должно однозначно определяться значение адреса h по ключу к; 2) равномерно распределять записи реального файла в пределах выделенного участка памяти; 3) быть легко вычислима. Наиболее используемыми методами /«-адресации являются методы срединных квадратов и методы, основанные на делении и умножении. Заметим, что эти же методы используются всегда, когда нужно получить псевдослучайные числа (ПСЧ) (см. под-разд. 20.1). Метод срединных квадратов (авторы Дж. фон Нейман и Н. Метрополии 1946). Сущность метода определяется операцией выделения п средних цифр из числа, полученного возведением в квадрат ключа записи. Пример. Рассмотрим пример из подразд. 17.1. Пусть ключ — совокупность полей {HP; ДВ}: Кх = 0001001; К\ = 0000001002001; Л, = 00100; К2 = 0008001; К\ = 0000064016001; А2 = 06401; Къ = 0911002; К] = 0829924644004; А3 = 92464; Ki = 0203125; Kj= 0041259765625; А, = 25976. В этом случае: A(&H = Alkm = A,- 0,18300. Л<йн=18;^)н=П71ит.д., где £масш — коэффициент масштабирования. 225 Метод, основанный на делении. Расчетная формула метода имеет вид: А = h(k) = k(modm), т. е. адрес записи вычисляется путем деления по модулю т ее ключа. Решающее значение имеет выбор числа т (на это обратил внимание еще автор этого и других конгруэнтных методов Д. Ле-мер): 1) если т — четное число, то значение h(k) всегда будет четным при четном значении к и нечетным при нечетном числе к; 2) если т равно степени основания системы счисления, то h(k) зависит только от самых правых разрядов к и не зависит от других; 3) если т кратно трем, то многие значения буквенных ключей, отличающиеся друг от друга лишь порядком букв, могут дать значения функции, разность между которыми кратна трем и др. На практике рекомендуется в качестве т выбирать простое число, близкое к размеру участка памяти. Метод, основанный на умножении. Расчетная формула метода имеет вид: Аош = h(k) = f(k)M, где f(k) — хеш-функция, дающая псевдослучайный адрес в интервале [0; 1]; М — размер участка памяти, выделенный для хранения информации. Пример. Пусть ключ — совокупность полей {HP; ДВ} (см. пример в подразд. 17.1). Тогда коэффициент масштабирования ктт = 0001001, ктах = 999 366-М= 18 300. Методы разрешения коллизий. К сожалению, хеш-адресации присущи серьезные недостатки: • полученная с помощью хеширования последовательность расположения в памяти хранимых записей не совпадает с последовательностью, определяемой первичным ключом; • реальна возможность коллизий (ситуаций, когда для двух разных записей вычисляется один и тот же адрес их хранения), что сделало необходимым разработку специальных методов выхода из таких ситуаций. Различают следующие методы разрешения коллизий: 1) открытой адресации: • двойное хеширование; 2) метод цепочек. 226 Линейное опробование. Сущность метода проста — организуется циклическая последовательность адресов следующего вида: т. е. первоначально по ключу вычисляется хеш-адрес. Если данный участок памяти свободен, запись помещается по этому адресу. Если по вычисленному адресу уже занесена другая запись, адрес уменьшается на единицу. Если там свободно, запись размещаем по «сдвинутому» адресу и далее до адреса базы. Если свободное место для записи и там не найдено, она адресуется в конец выделенного участка памяти; при необходимости этот адрес уменьшается на единицу и т.д. Считывание записи проводится в почти такой же последовательности: по ключу вычисляют хеш-адрес; проверяют значение ключа записи, находящейся по этому адресу — если это искомая запись (т.е. запись с искомым ключом), ее считывают, если нет — адрес сдвигают на единицу и далее до нахождения нужной записи. Этому методу свойствен один принципиальный (методический) недостаток — возможность так называемого «вторичного скучива-ния», под которым понимают возможность новых коллизий. Попытка исключить недостаток вызвала к жизни другой метод — двойное хеширование. Двойное хеширование. Идея метода такая же, как у предыдущего, но смещение адреса осуществляется не на единицу, а на переменную величину D=f(A(J)), где/— хеш-функция (как правило, отличная от К). Считывание проводится так же, как и при линейном опробовании. Метод цепочек. Идея метода состоит в том, что организуют М линейных списков: по одному на каждый возможный хеш-адрес. Вся память разбивается на две части — основную область и область перемешивания (на практике на область перемешивания выделяют 20 —30 % основной области). Область перемешивания и предназначена для хранения линейных списков. Порядок действий таков: после хеширования ключа, если участок основной памяти свободен, запись размещается по полученному адресу. Если участок занят, по указателю переходят к следующему участку памяти в области перемешивания. Если он свободен, запись помещают в него. Если нет, переходят (по указателю) к следующему и далее до конца списка. 227 Поиск выполняется в той же последовательности: вначале проверяются участок памяти по вычисленному адресу основной памяти и ключ записи. Если его значение соответствует искомому, происходит считывание, если нет, двигаются по указателям в области перемешивания до нахождения искомой записи. Несмотря на присущее такой адресации нерациональное (избыточное) использование памяти, описанным образом адресуются данные практически во всех современных персональных ЭВМ, характеристики которых позволяют некоторый перерасход ресурса памяти для разрешения коллизий и исключения сбоев в размещении и поиске данных. РАЗДЕЛ III |
Последнее изменение этой страницы: 2019-05-08; Просмотров: 262; Нарушение авторского права страницы