Изменения

Перейти к: навигация, поиск

Хеширование кукушки

23 байта добавлено, 16:35, 21 июня 2017
м
Нет описания правки
[[Image:cuckoo.png|thumb|Пример хеширования кукушки. Стрелки показывают второе возможное место элементов. Если нам надо будет вставить новый элемент на место А, то мы поместим А в его вторую ячейку, занятую В, а В переместим в его вторую ячейку, которая сейчас свободна. А вот помещение нового элемента на место Н не получится: так как Н — часть цикла, добавленный элемент будет вытеснен после прохода по циклу.]]
'''Хеширование кукушки''' (англ. ''Cuckoo hashing'') — один из способов борьбы с коллизиями при создании хеш-таблицы.
==Алгоритм==
Основная идея хеширования кукушки — использование двух хеш-функций вместо одной (далее <tex>h_1(x)</tex> и <tex>h_2(x)</tex>). Также есть вариант алгоритма, в котором используются две хеш-таблицы, и первая хеш-функция указывает на ячейку из первой таблицы, а вторая — из второй. Рассмотрим алгоритмы функций add(x), remove(x) и contains(x).
Выберем <tex>2 </tex> хэш-функции <tex>h_1(x)</tex> и <tex>h_2(x)</tex> (из [[Универсальное семейство хеш-функций | универсального семейства хэш-функций]]).
'''Add''' — добавляет элемент с ключом <tex>x</tex> в хэш-таблицу
# Иначе запоминаем элемент из этой ячейки, кладем туда старый. Проверяем, не зациклились ли мы.
# Если не зациклились, то продолжаем данную процедуру поиска свободного места пока не найдем свободное место или зациклимся.
# Иначе выбираем <tex>2 </tex> новые хеш-функции и перехешируем все добавленные элементы.
# Так же после добавления нужно увеличить размер таблицы в случае если она заполнена.
Зацикливание может возникнуть при добавлении элемента. Пусть мы добавляем элемент <tex>x</tex>. И обе ячейки <tex>h_1(x)</tex> и <tex>h_2(x)</tex> заняты. Пусть, элемент <tex>x</tex> положили в ячейку <tex>h_i(x)</tex>. Если в ходе перемещений элементов в таблице на очередном шаге мы опять хотим переместить элемент <tex>x</tex> в ячейку <tex>h_i(x)</tex>, чтобы в ячейку <tex>h_j(x) ~(i \ne j) </tex> поместить какой-то <tex>y</tex> (это может произойти, если в ходе перемещений элемент <tex>x</tex> был перемещен в ячейку <tex>h_j(x)</tex>), то произошло зацикливание.
Например зацикливание возникнет если добавить в хэш-таблицу <tex>3 </tex> элемента <tex>x,y,z</tex> у которых <tex>h_1(x)</tex> = <tex>h_1(y)</tex> =<tex>h_1(z)</tex> и <tex>h_2(x)</tex> = <tex>h_2(y)</tex> = <tex>h_2(z)</tex> .
==Время работы алгоритма==
Удаление и проверка происходят за <tex>O(1)</tex> (что является основной особенностью данного типа хеширования), добавление в среднем происходит за <tex>O(1)</tex>. Первые два утверждения очевидны: требуется проверить всего лишь <tex>2 </tex> ячейки таблицы.
{{ Утверждение
96
правок

Навигация