Изменения

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

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

651 байт добавлено, 09:05, 22 июня 2017
м
Плюсы и минусы алгоритма
==Алгоритм==
Основная идея хеширования кукушки — использование двух хеш-функций вместо одной (далее <tex>h_1(x)</tex> и <tex>h_2(x)</tex>). Также есть вариант алгоритма, в котором используются две хеш-таблицы, и первая хеш-функция указывает на ячейку из первой таблицы, а вторая — из второй. Рассмотрим алгоритмы функций <tex>add(x), remove(x) </tex> и <tex>contains(x)</tex>.
Выберем <tex>2</tex> хэш-функции <tex>h_1(x)</tex> и <tex>h_2(x)</tex> (из [[Универсальное семейство хеш-функций | универсального семейства хэш-функций]]).
===='''Add''' — добавляет ==== Добавляет элемент с ключом <tex>x</tex> в хэш-таблицу
# Если одна из ячеек с индексами <tex>h_1(x)</tex> или <tex>h_2(x)</tex> свободна, кладем в нее элемент.
# Так же после добавления нужно увеличить размер таблицы в случае если она заполнена.
===='''Remove''' — удаляет ====Удаляет элемент с ключом <tex>x</tex> из хэш-таблицы.
# Смотрим ячейки с индексами <tex>h_1(x)</tex> и <tex>h_2(x)</tex>.
# Если в одной из них есть искомый элемент, просто помечаем эту ячейку как свободную.
===='''Contains''' — проверяет ====Проверяет на наличие элемента <tex>x</tex> в хэш-таблице
# Смотрим ячейки с индексами <tex>h_1(x)</tex> и <tex>h_2(x)</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)=h_1(y)=h_1(z)</tex> и <tex>h_2(x)=h_2(y)=h_2(z)</tex> .
Одним из способов решения проблемы зацикливания является смена хэш-функции, что было доказано Джоном Трампом<ref>https://eprint.iacr.org/2014/059.pdf</ref>
Обзор Мутцемахера<ref>''M. Mitzenmacher.'' Proceedings of of the 17th Annual European Symposium on Algorithms (ESA). — 2009.</ref> представляет открытые проблемы, связанные с кукушкиным хешированием.
 
Самый большой минуc {{---}} потраченная память. Чтобы гарантировать <tex>O(n)</tex> по времени, нужно чтобы пары ключ/значение занимали не более <tex>50\%</tex> памяти, потому что вытеснение старых элементов становится трудоемким. Также, добавление каждой новой хеш-функции значительно увеличивает среднюю скорость заполнения таблицы.
==См. также==
96
правок

Навигация