Двойное хэширование — различия между версиями
(→Двойное хэширование) |
(→Двойное хэширование) |
||
Строка 1: | Строка 1: | ||
− | |||
'''Двойное хэширование (double hashing)''' - один из лучших методов открытой адресации. Перебор ячеек хэш-таблицы, возникающий при двойном хешировании, обладает свойствами, присущими равномерному хешированию. При двойном хешировании хэш-функция <tex> h </tex> имеет следующий вид: | '''Двойное хэширование (double hashing)''' - один из лучших методов открытой адресации. Перебор ячеек хэш-таблицы, возникающий при двойном хешировании, обладает свойствами, присущими равномерному хешированию. При двойном хешировании хэш-функция <tex> h </tex> имеет следующий вид: | ||
<center> | <center> | ||
− | <tex> h(k,i) = (h_1(k) + i*h_2(k)) mod m </tex> | + | <tex> h(k,i) = (h_1(k) + i*h_2(k)) \; mod \; m </tex> |
</center> | </center> | ||
Строка 15: | Строка 14: | ||
<center> | <center> | ||
− | <tex> h_1(k) = k mod 13 </tex> | + | <tex> h_1(k) = k \; mod \; 13 </tex> |
</center> | </center> | ||
<center> | <center> | ||
− | <tex> h_2(k) = 1 + k mod 11 </tex> | + | <tex> h_2(k) = 1 + k \; mod \; 11 </tex> |
</center> | </center> | ||
− | Мы хотим вставить ключ 14. Изначально <tex> i = 0 </tex>. Тогда <tex> h(14,0) = (h_1(14) + 0*h_2(14)) mod 13 = 1 </tex>. Но ячейка с индексом 1 занята, поэтому увеличиваем <tex> i </tex> на 1 и пересчитываем значение хэш-функции. Делаем так, пока не дойдем до пустой ячейки. При <tex> i = 2 </tex> получаем <tex> h(14,2) = (h_1(14) + 2*h_2(14)) mod 13 = 9 </tex>. Ячейка с номером 9 свободна, значит записываем туда наш ключ. | + | Мы хотим вставить ключ 14. Изначально <tex> i = 0 </tex>. Тогда <tex> h(14,0) = (h_1(14) + 0*h_2(14)) \; mod \; 13 = 1 </tex>. Но ячейка с индексом 1 занята, поэтому увеличиваем <tex> i </tex> на 1 и пересчитываем значение хэш-функции. Делаем так, пока не дойдем до пустой ячейки. При <tex> i = 2 </tex> получаем <tex> h(14,2) = (h_1(14) + 2*h_2(14)) \; mod \; 13 = 9 </tex>. Ячейка с номером 9 свободна, значит записываем туда наш ключ. |
Для того, чтобы последовательность исследования могла охватить всю таблицу, значение <tex> h_2 </tex> должно быть взаимно простым с размером таблицы. Есть два удобных способа это сделать. Первый состоит в том, что в качестве размера таблицы используется простое число, а <tex> h_2 </tex> возвращает натуральные числа, меньшие <tex> m </tex>. Второй - размер таблицы является степенью двойки, а <tex> h_2 </tex> возвращает нечетные значения. | Для того, чтобы последовательность исследования могла охватить всю таблицу, значение <tex> h_2 </tex> должно быть взаимно простым с размером таблицы. Есть два удобных способа это сделать. Первый состоит в том, что в качестве размера таблицы используется простое число, а <tex> h_2 </tex> возвращает натуральные числа, меньшие <tex> m </tex>. Второй - размер таблицы является степенью двойки, а <tex> h_2 </tex> возвращает нечетные значения. |
Версия 04:16, 17 мая 2011
Двойное хэширование (double hashing) - один из лучших методов открытой адресации. Перебор ячеек хэш-таблицы, возникающий при двойном хешировании, обладает свойствами, присущими равномерному хешированию. При двойном хешировании хэш-функция
имеет следующий вид:
где
и - вспомогательные хеш-функции, - размер хэш-таблицы. Иными словами, последовательность индексов исследуемых ячеек при работе с ключом представляет собой арифметическую прогрессию (по модулю ) с первым членом и шагом . Следовательно, в данном случае последовательность исследования зависит от ключа k по двум параметрам - выбор начальной исследуемой ячейки и расстояние между двумя исследуемыми ячейками, так как оба параметра зависят от значения ключа.Пример вставки элемента при двойном хешировании приведен на рисунке справа.
Показана хэш-таблица размером 13 ячеек, в которой используются вспомогательные функции:
Мы хотим вставить ключ 14. Изначально
. Тогда . Но ячейка с индексом 1 занята, поэтому увеличиваем на 1 и пересчитываем значение хэш-функции. Делаем так, пока не дойдем до пустой ячейки. При получаем . Ячейка с номером 9 свободна, значит записываем туда наш ключ.Для того, чтобы последовательность исследования могла охватить всю таблицу, значение
должно быть взаимно простым с размером таблицы. Есть два удобных способа это сделать. Первый состоит в том, что в качестве размера таблицы используется простое число, а возвращает натуральные числа, меньшие . Второй - размер таблицы является степенью двойки, а возвращает нечетные значения.Двойное хэширование превосходит другие в смысле количества последовательностей исследований. Это связано с тем, что каждая возможная пара
дает отличающуюся от других последовательность исследований.Литература
- Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. Алгоритмы. Построение и анализ — Вильямс, 2010. - 1296с. — ISBN 978-5-8459-0857-4, 0-07-013151-1.