Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РГР №1.docx
Скачиваний:
8
Добавлен:
07.12.2018
Размер:
243.68 Кб
Скачать

Расщепление, использующее хеширование методом деления

Идея этого расщепления иллюстрируется рис. 1. Мы предполагаем, что F хешируется методом деления h0 : c -> R(c,N) , где R(c,N) означает остаток от деления c mod N , и N=100. На рисунке 1.а возникает коллизия в блоке 53. Чтобы решить ее, мы назначаем только для ключей c C53 = h0–1(53) прямой адрес через функцию h1 : c -> R(c,2N).

Рисунок 1.b иллюстрирует ситуацию после перевставок. Благодаря следующему свойству, создается только один новый прямой адрес:

Для каждого c, x , выполняется хотя бы одно из тождеств:

R(c,2x) = R(c,x

(P)

R(c,2x)=R(c,x)+x

Понятно (следуя из P), что для обычного C (N<< card C) и каждого m < N, h1 расщепляет Cm = h-1(m).

Рис.1 (а) – возникает коллизия в блоке m = 53.

(b) – расщепление функцией h1 разрешает коллизию и избавляет от создания избыточной записи

Более того, всякий новый адрес (мы назовем его перераспределенный адрес) больше, чем N и, если m1 ≠ m2, m1,m2 < N , то соответствующие перераспределенные адреса будут различными. Это значит, что записи всегда переместятся в пустой блок. Если хеширование функцией h1 случайно и b >> 1, то схема Бернулли предполагает, что замена адреса записи нулем или изменение больше, чем (b+1) адресов записей, маловероятно. Большинство коллизий будет, таким образом, решено без создания переполнения, и поэтому разрешение коллизии будет стоить почти всегда только двух дисковых доступов.

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

Кроме того, пусть m2 будет перераспределенным адресом для m1 , и пусть r1, r2,…,rk будет последовательностью вставок таких, что

  1. h0(ck) = m1

  2. rk означает, что появилась первая коллизия в m1 или m2 после расщепления Cm1

Если h1 хеширует случайно, то нет ни одного алгоритма расщепления, создающего только один перераспределенный адрес, который бы давал большее значение k. Снова это оптимальное свойство является результатом использования пустых блоков.

Полное описание

Пусть hj : c -> R(c,2jN), j = 0, 1, 2, …

(А)

Пусть Сm,j = hj-1(m), m < 2jN. Для расщепления Сm,j мы используем hj+1 , которая ограничена Сm,j.

Понятно, что расщепление, описанное в (А), выполняет условие (Р). Поэтому все предыдущие свойства, обсуждавшиеся выше, остаются в силе для каждой пары j, j+1.

Описание vh1

Мы описыванием виртуальное хеширование VH1:

  • предоставляющееся с расщеплением (А)

  • соответствующее следующим предположениям:

  1. для переполнений используется метод «отдельного формирования цепочки» (“separate chaining” method)

  2. память для блоков m = 2j-1N, 2j-1N+1,…, 2jN-1 выделяется при первом расщеплении hj .

  3. пусть αmax есть некоторый коэффициент загрузки и пусть αj = x/b2jN. Мы используем расщепление для разрешения коллизии в блоке, доступным через hj , только если αj > αmax . Иначе мы создаем переполнение.

Мы используем отдельное формирование цепочки (“separate chaining” method), потому что это один из лучших классических методов разрешения коллизий (CMR). (2) выбран для простоты такого способа распределения. (3) позволяет нагружать блоки более эффективно, чем если бы мы имели расщепление для любой коллизии. А именно, никакое распределение не выполняется до тех пор, пока коэффициент загрузки уже используемых блоков меньше либо равен αmax . Максимальный индекс j множества используемых hj будем называть уровнем файла; j уровень hj.