Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VOPROS_K_EKZAMENU_SiAOD.docx
Скачиваний:
67
Добавлен:
27.09.2019
Размер:
120.34 Кб
Скачать
  1. Хеширование Выбор хеш-функций.

Хеширование.

Метод адреса или методы рассеянной памяти, преобразование ключа в адрес.

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

Исп. хеш-адрес, кот. исп. для проведения поиска.

Имеется память, состоящ. из m ячеек. Mj , 0 <= j <= m-1

Каждая яч. м. содержать 1 значение.

При некотором заданном значении j время обращения к mj постоянно и не зависит от m.

Методы с исп. хеширования исп. св-во памяти с произвольным доступом больше, чем все др. методы поиска.

b1… bn k1… kn

h(k)

b1 k1 -> h(k1)

Данный метод поиска основан на том, что эл., явл. аргументом поиск, т.е. k, м.б. исп. в кач. индекса для массива.

ki <> kj h(ki) = h(kj) - коллизия

Для ее разрешения сущ. методы.

Для исп. хеширования нужно решить 2 задачи, кот. решаются независимо друг от друга.

  1. нужно выбрать хеш-функцию

  2. нужно выбрать способ разрешения коллизии.

Выбор хеш-функции

Идеальная хеш-функция – кот.

  1. быстро вычисляется (часто зависит от особенностей компа)

  2. отображает пространство имен в пр-во адресов равномерно рассеивая имена по памяти. Т.е. число коллизий д.б. минимально. (часто зависит от особенностей данных)

Стремиться надо к построению такой ф-ции, кот. будет равномерно рассеивать по памяти те подмножества записей, кот. могут встретиться.

На практике такое сделать сложно.

Любая разумная хеш-функция будет удовлетворительно работать на большинстве мн-ва имен. В т.ж. время для любой самой хорошей хеш-функции сущ. мн-во имен, на кот. она работает плохо.

Для быстрого вычисления хеш-адресов большинство хеш – функций близки к примитивным операциям, кот. допустимы для ЭВМ и они лучше описываются на уровне операций над двоичными наборами представлениях имен и адресов.

Пример:

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

c1 c2 c3 c4 c5 | c6 c7 c8 c9 c10

AN 0 0 0 0 0 | 0 1 1 0 1 0 AT 0 0 0 0 0 | 1 0 0 1 1 1

NO 0 1 1 0 1 | 0 1 1 1 0 2

ON 0 1 1 1 0 | 0 1 1 0 1 4

PI 0 1 1 1 1 | 0 1 0 0 0 6

h(k) = (c4c5c6)10/c/c

  1. Хеширование. Разрешение коллизий.

49й вопрос +

Разрешение коллизий

Сущ. 2 распростр. способа.

  1. метод цепочек

  2. метод открытой адресации

Метод цепочек:

b1… bn k1… kn h(k) Может возникнуть коллизия.

Некоторые хеш-адреса м.б. одинаковыми для различных ключей. Самый очевидный путь – поддержка связных списков, по 1 для каждого хеш-кода.

После хеширования ключа выполняется последовательный поиск в списке с соответствующим адресом. Для наиболее быстрого поиска в списке его желательно хранить в отсортированном виде.

Метод открытой адресации:

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

Их просматривают до тех пор, пока не будет найден ключ К или пустая позиция. Если встречается пустая позиция, то делается вывод о том, что ключ в таблице отсутствует. В рамках этого подхода сущ. несколько алгоритмов.