Материалы к теме 5.

advertisement
Тема 5. Хэширование.
Основной принцип хэширования.
Выделенная память для хранения кортежей разделяется на В сегментов. Задается хэшфункция (h(n)), аргументом которой является ключ кортежа, а возвращаемое значение
принадлежит интервалу [0; B-1].
Пусть требуется поместить в хэш – структуру кортеж с ключом K. Тогда сегмент, в
который требуется поместить этот кортеж, определяется как h(K).
Пример статической хэш – структуры (хэш – таблица имеет заданное число сегментов).
Вставка:
h(a) = 1
h(b) = 2
h(c) = 1
h(d) = 0
0
d
1
a
c
2
b
e
3
h(e) = 1
Недостаток – большой файл данных будет иметь длинные цепочки переполнения – много
операций ввода/вывода при поиске кортежей.
Динамические хэш – структуры –
подстраивается под размер файла данных.
структуры,
в
которых
число
сегментов
Расширяемые хэш – структуры – структуры с оглавлением.
1.
Используется j старших бит хэш - значения:
оглавление
1
0001
1
0
1
1
j=1 в оглавлении означает, что для
хэширования используется максимум j
старших бит.
Каждый блок данных также имеет число
значащих бит (i).
Правило: i  j.
1001
1100
Вставка в расширяемую хэш – структуру.
Вставить кортеж с хэш - значением 1010.
Старший бит 1 – требуется вставить во второй блок, но места там нет.
i=j=1 – это сигнал о том, что требуется увеличивать оглавление. Теперь j=2.
Промежуточный шаг – удвоение размера оглавления (каждая строка прежнего оглавления
удваивается, прибавляя к ключу справа 0 в одной строке и 1 – во второй строке).
1
0001
2
00
01
10
11
1
1001
1100
Теперь при вставке получим, что в нужном блоке i<j. Тогда блок делится на два блока, в
каждом i=i+1=2. Кортежи распределяются между двумя блоками согласно второму биту
хэш - значения.
1
0001
2
00
01
2
10
1001
11
1010
2
1100
Вставить кортеж с хэш - значением 0111. – простой случай (есть место в первом блоке
данных (старший бит 0)).
1
0001
2
00
01
0111
2
10
1001
11
1010
2
1100
Вставить кортеж с хэш - значением 0000 – разбиение первого блока на два блока
согласно значению второго бита.
2
0000
0001
2
0111
2
00
2
01
10
1001
11
1010
2
1100
Вставить кортеж с хэш - значением 1001.
Требуется вставить в 3 блок. i=j , следовательно, требуется удвоить размер оглавления.
2
0000
0001
2
3
000
0111
001
010
3
011
1001
100
1001
101
110
3
1010
111
2
1100
2. Линейная хэш – структура.
Используется j младших бит хэш – значения. Задается пороговое значение
U
число кортежей в хэш  структуре
число сегментов
m – число сегментов хэш – структуры (блоки переполнения не включаются).
Пример. Пусть пороговое значение = 1.7
Дана линейная хэш – структура.
0000
1111
1010
0
1
Вставка хэш – значения 0101.
Вставка должна быть осуществлена во второй сегмент, но будет превышено пороговое
значение: 4/2=2 > 1.7 .
При превышении порогового значения требуется добавить в структуру новый сегмент и
перераспределить кортежи, если необходимо.
В нашем случае вместе с увеличением количества сегментов увеличивается число
значащих бит j=2, m=3.
Правило. Если j младших бит хэш – значения (h(k)[j]) не являются номером реального
сегмента, т.е. h(k)[j] > m, следует поместить кортеж в сегмент с номером h(k)[j] – 2j-1.
В данном случае есть кортеж с хэш – значением 1111. h(k)[j] = 11. Следовательно, его
требуется поместить в сегмент с номером = 11 – (2)дв.исч.=11 – 10 = 01.
0000
0101
1010
1111
00
01
10
Вставка кортежа с хэш – значением 0001.
Требуется вставить в сегмент с номером 01. Число кортежей = 5, число ячеек = 3.
5/3 =1.66<1.7.
Добавление нового сегмента невозможно. Тогда создается блок переполнения к сегменту.
0001
0000
0101
1010
1111
00
01
10
Вставка кортежа с хэш – значением 0111.
Происходит превышение порогового значения 6 записей / 3 ячейки = 2 > 1.7.
Добавляется новый сегмент. Число значащих бит остается без изменения. При
перераспределении кортежей блок переполнения аннулируется.
0000
0001
1010
0101
00
01
1111
0111
10
11
Download