Тема 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