Jump to content

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

Пример хеширования Cuckoo. Стрелки показывают альтернативное расположение каждой клавиши. Новый элемент будет вставлен в место A путем перемещения A в его альтернативное место, которое в настоящее время занято B, и перемещения B в его альтернативное место, которое в настоящее время свободно. Вставка нового элемента в позицию H не удастся: поскольку H является частью цикла (вместе с W), новый элемент снова будет исключен.

Хеширование с кукушкой — это схема в компьютерном программировании для разрешения хеш-коллизий значений хеш-функций в таблице с в худшем случае постоянным временем поиска . Название происходит от поведения некоторых видов кукушек , когда птенец кукушки выталкивает другие яйца или детенышей из гнезда, когда он вылупляется, что является разновидностью поведения, называемого выводковым паразитизмом ; аналогично, вставка нового ключа в хеш-таблицу кукушки может переместить старый ключ в другое место в таблице.

Хеширование с кукушкой было впервые описано Расмусом Пагом и Флеммингом Фришем Родлером в докладе на конференции 2001 года. [1] Статья была удостоена награды Европейского симпозиума по алгоритмам «Испытание временем» в 2020 году. [2] : 122 

Операции

[ редактировать ]

Хеширование с кукушкой — это форма открытой адресации , при которой каждая непустая ячейка хеш-таблицы содержит ключ или пару ключ-значение . Хэш -функция используется для определения местоположения каждого ключа, а его присутствие в таблице (или связанное с ним значение) можно определить, исследовав эту ячейку таблицы. Однако открытая адресация страдает от коллизий , которые случаются, когда в одну и ту же ячейку отображается более одного ключа.Основная идея хеширования с кукушкой заключается в разрешении коллизий с помощью двух хэш-функций вместо одной. Это обеспечивает два возможных местоположения в хеш-таблице для каждого ключа. В одном из часто используемых вариантов алгоритма хеш-таблица разбивается на две меньшие таблицы одинакового размера, и каждая хэш-функция предоставляет индекс в одну из этих двух таблиц. Обе хэш-функции также могут предоставлять индексы в одну таблицу. [1] : 121-122 

Хеширование Cuckoo использует две хеш-таблицы: и . Предполагая длина каждой таблицы, хэш-функции для двух таблиц определяются как: и где это ключ и это набор, ключи которого хранятся в из или из . Операция поиска выглядит следующим образом: [1] : 124 

 функция  поиска (x  возвращает     )   конечная функция 

Логическое или ( ) означает, что значение ключа находится либо в или , что в худшем случае. [1] : 123 

Удаление

[ редактировать ]

Удаление выполняется в время с момента зондирования не задействовано. При этом игнорируются затраты на операцию сжатия, если таблица слишком разрежена. [1] : 124-125 

При вставке нового элемента с помощью ключа , первый шаг включает проверку наличия слота стола занят. Если это не так, элемент вставляется в этот слот. Однако если слот занят, существующий элемент удаляется и вставляется в . Затем, вставляется в таблицу выполнив ту же процедуру. Процесс продолжается до тех пор, пока не будет найдено пустое место для вставки ключа. [1] : 124-125  Чтобы избежать бесконечного цикла , порог указано. Если количество итераций превышает этот фиксированный порог, оба и перехэшируются с новыми хеш-функциями , и процедура вставки повторяется. Ниже приведен псевдокод для вставки: [1] : 125 

1  функция  (x)  Insert 2  если  поиск(x),  то 3  возврата 4  конец, если   цикла 5  циклов Максимальное  время 6,  если   =   затем 7  := х8  возврат 9  конец, если 10 х 11  если   =   затем 12  := х13  возвращение 14  конец, если 15 х 16  конечная петля 17 перефразирования()18 вставка(х)19  конечная функция 

В строках 10 и 15 используется «подход кукушки», заключающийся в ударе по другим клавишам, занимающим повторяется до тех пор, пока у каждого ключа не будет своего «гнезда», т.е. элемента вставляется в пустой слот в любой из двух таблиц. Обозначения выражает обмен и . [1] : 124-125 

Вставки успешны в ожидаемое постоянное время, [1] даже учитывая возможность перестроения таблицы, пока количество ключей остается ниже половины емкости хеш-таблицы, т. е. коэффициент загрузки ниже 50%.

Один из методов доказательства этого использует теорию случайных графов : можно сформировать неориентированный граф , называемый «графом кукушки», который имеет вершину для каждого местоположения хеш-таблицы и ребро для каждого хешированного значения, причем конечные точки ребра являются два возможных местоположения значения. Тогда жадный алгоритм вставки для добавления набора значений в хеш-таблицу кукушки успешен тогда и только тогда, когда граф кукушки для этого набора значений является псевдолесом , графом с не более чем одним циклом в каждой из его связных компонент . Любой подграф, индуцированный вершинами, у которого ребер больше, чем вершин, соответствует набору ключей, для которых в хеш-таблице недостаточно слотов. Когда хеш-функция выбирается случайным образом, граф кукушки представляет собой случайный граф в модели Эрдеша-Реньи . С высокой вероятностью при коэффициенте загрузки меньше 1/2 (что соответствует случайному графу, в котором отношение числа ребер к числу вершин ограничено ниже 1/2) граф является псевдолесом и алгоритм хеширования кукушки успешно разместил все ключи. Та же теория также доказывает, что ожидаемый размер Связная компонента графа кукушки мала, что гарантирует, что каждая вставка занимает постоянное ожидаемое время. Однако также с высокой вероятностью коэффициент загрузки больше 1/2 приведет к появлению гигантского компонента с двумя и более циклами, что приведет к сбою структуры данных и необходимости изменения ее размера. [3]

Поскольку теоретическая случайная хэш-функция требует слишком много места для практического использования, важным теоретическим вопросом является то, какие практические хеш-функции достаточны для хеширования Cuckoo. Один из подходов — использовать k-независимое хеширование . В 2009 году было показано [4] что -независимости достаточно, и нужна как минимум 6-независимость. Другой подход — использовать табулационное хеширование , которое не является 6-независимым, но было показано в 2012 году. [5] иметь другие свойства, достаточные для хеширования Cuckoo.Третий подход 2014 года [6] заключается в незначительной модификации хеш-таблицы кукушки с помощью так называемого тайника, который дает возможность использовать не что иное, как 2-независимые хэш-функции.

Упражняться

[ редактировать ]

На практике хеширование с кукушкой происходит примерно на 20–30% медленнее, чем линейное зондирование , которое является самым быстрым из распространенных подходов. [1] Причина в том, что хеширование с кукушкой часто приводит к двум промахам в кэше за поиск, чтобы проверить два места, где может храниться ключ, тогда как линейное зондирование обычно вызывает только один промах в кэше за поиск.Однако из-за гарантий наихудшего случая в отношении времени поиска хеширование с кукушкой все еще может быть полезным, когда скорость ответа в реальном времени требуется .

Даны следующие хэш-функции (две младшие цифры числа k по основанию 11):


В следующих двух таблицах показана вставка некоторых примеров элементов. Каждый столбец соответствует состоянию двух хеш-таблиц с течением времени. Возможные места вставки для каждого нового значения выделены. Последний столбец иллюстрирует неудачную вставку из-за цикла, подробности ниже.

Таблица 1: используется h(k)
Шаги
Номер шага 1 2 3 4 5 6 7 8 9 10
Ключ вставлен 53 50 20 75 100 67 105 3 36 45
ч(к) 9 6 9 9 1 1 6 3 3 1
Записи хеш-таблицы
0
1 100 67 67 67 67 45
2
3 3 36 36
4
5
6 50 50 50 50 50 105 105 105 105
7
8
9 53 53 20 75 75 75 53 53 53 53
10
Таблица 2: используется h′(k)
Шаги
Номер шага 1 2 3 4 5 6 7 8 9 10
Ключ вставлен 53 50 20 75 100 67 105 3 36 45
ч'(к) 4 4 1 6 9 6 9 0 3 4
Записи хеш-таблицы
0 3 3
1 20 20 20 20 20 20 20
2
3
4 53 53 53 53 50 50 50 50
5
6 75 75 75 75
7
8
9 100 100 100 100 100
10

Если вы попытаетесь вставить элемент 45, то попадете в цикл и потерпите неудачу. В последней строке таблицы мы снова находим ту же исходную ситуацию, что и в начале.



Таблица 1 Таблица 2
45 заменяет 67 в ячейке 1 67 заменяет 75 в ячейке 6
75 заменяет 53 в ячейке 9 53 заменяет 50 в ячейке 4
50 заменяет 105 в ячейке 6. 105 заменяет 100 в ячейке 9.
100 заменяет 45 в ячейке 1 45 заменяет 53 в ячейке 4
53 заменяет 75 в ячейке 9 75 заменяет 67 в ячейке 6
67 заменяет 100 в ячейке 1 100 заменяет 105 в ячейке 9.
105 заменяет 50 в ячейке 6. 50 заменяет 45 в ячейке 4
45 заменяет 67 в ячейке 1 67 заменяет 75 в ячейке 6

Вариации

[ редактировать ]

Было изучено несколько вариантов хеширования с кукушкой, в первую очередь с целью улучшения использования пространства за счет увеличения коэффициента нагрузки , который он может выдержать, до числа, превышающего 50%-ный порог базового алгоритма. Некоторые из этих методов также можно использовать для снижения частоты сбоев хеширования с кукушкой, в результате чего перестроения структуры данных будут происходить гораздо реже.

Можно ожидать, что обобщения хэширования с кукушкой, в которых используется более двух альтернативных хэш-функций, будут эффективно использовать большую часть емкости хеш-таблицы, жертвуя при этом некоторой скоростью поиска и вставки. Использование всего трех хэш-функций увеличивает нагрузку до 91%. [7]

Другое обобщение хеширования с кукушкой, называемое блокированным хешированием с кукушкой, использует более одного ключа на сегмент и сбалансированную схему распределения. Использование всего двух ключей на сегмент позволяет повысить коэффициент загрузки выше 80%. [8]

Еще один вариант хеширования с кукушкой, который был изучен, — это хеширование с кукушкой с помощью тайника . Тайник в этой структуре данных представляет собой массив постоянного количества ключей, используемый для хранения ключей, которые не могут быть успешно вставлены в основную хеш-таблицу структуры. Эта модификация снижает частоту неудач хеширования с кукушкой до функции обратного полинома с показателем степени, который можно сделать сколь угодно большим за счет увеличения размера тайника. Однако большие тайники также означают более медленный поиск ключей, которых нет или которые находятся в тайнике. Тайник можно использовать в сочетании с более чем двумя хэш-функциями или с заблокированным хешированием с кукушкой для достижения как высокого коэффициента загрузки, так и небольшой частоты отказов. [9] Анализ хеширования с кукушкой с помощью тайника распространяется на практические хэш-функции, а не только на модель случайной хеш-функции, обычно используемую в теоретическом анализе хеширования. [10]

Некоторые люди рекомендуют упрощенное обобщение хэширования с кукушкой, называемое перекошенным ассоциативным кешем в некоторых кешах ЦП . [11]

Другой вариант хеш-таблицы кукушки, называемый фильтром кукушки , заменяет сохраненные ключи хеш-таблицы кукушки гораздо более короткими отпечатками пальцев, вычисляемыми путем применения к ключам другой хэш-функции. Чтобы эти отпечатки пальцев можно было перемещать внутри фильтра кукушки, не зная ключей, от которых они получены, два местоположения каждого отпечатка пальца могут быть вычислены друг из друга с помощью побитового исключения или операции с отпечатком пальца или с помощью хэша. отпечатка пальца. Эта структура данных образует приблизительную структуру данных о членстве в наборе, имеющую почти те же свойства, что и фильтр Блума : она может хранить члены набора ключей и проверять, является ли ключ запроса членом, с некоторой вероятностью ложных срабатываний (запросы, которые ошибочно указаны как часть набора), но ложноотрицательных результатов нет . Тем не менее, он улучшает фильтр Блума во многих отношениях: его использование памяти меньше в постоянный коэффициент, он имеет лучшую локальность ссылки и (в отличие от фильтров Блума) позволяет быстро удалять элементы набора без дополнительных затрат на хранение. [12]

[ редактировать ]

Исследование Жуковски и др. [13] показал, что хеширование с кукушкой происходит намного быстрее, чем цепное хеширование для небольших хеш-таблиц, находящихся в кэше на современных процессорах. Кеннет Росс [14] показал, что сегментированные версии хеширования с кукушкой (варианты, в которых используются сегменты, содержащие более одного ключа) работают быстрее, чем традиционные методы, даже для больших хеш-таблиц, когда использование пространства высоко. Производительность сегментированной хеш-таблицы Cuckoo была дополнительно исследована Аскитисом. [15] с его производительностью по сравнению с альтернативными схемами хеширования.

Опрос Митценмахера [7] представляет открытые проблемы, связанные с хешированием кукушки по состоянию на 2009 год.

Известные пользователи

[ редактировать ]

Хеширование Cuckoo используется в системе рекомендаций TikTok для решения проблемы «встраивания коллизий таблиц», что может привести к снижению качества модели.Система рекомендаций TikTok «Монолит» использует преимущество разрешения коллизий кукушкиного хеширования, чтобы предотвратить сопоставление разных концепций с одними и теми же векторами. [16]

См. также

[ редактировать ]
  1. Перейти обратно: Перейти обратно: а б с д и ж г час я дж Паг, Расмус ; Родлер, Флемминг Фриш (2001). «Кукушка Хашинг». Алгоритмы — ЕКА 2001 . Конспекты лекций по информатике. Том 2161. CiteSeerX   10.1.1.25.4189 . дои : 10.1007/3-540-44676-1_10 . ISBN  978-3-540-42493-2 .
  2. ^ «ESA - Европейский симпозиум по алгоритмам: награда ESA «Испытание временем 2020»» . esa-symposium.org . Наградной комитет: Ури Цвик , Самир Хуллер , Эдит Коэн . Архивировано из оригинала 22 мая 2021 г. Проверено 22 мая 2021 г. {{cite web}}: CS1 maint: другие ( ссылка )
  3. ^ Куцельнигг, Рейнхард (2006). Двудольные случайные графы и хэширование с кукушкой (PDF) . Четвертый коллоквиум по математике и информатике. Дискретная математика и теоретическая информатика. Том. АГ. стр. 403–406.
  4. ^ Коэн, Джеффри С. и Дэниел М. Кейн. «Границы независимости, необходимые для хеширования с кукушкой». Транзакции ACM в алгоритмах (2009).
  5. ^ Путрашку, Михай и Миккель Торуп. «Сила простого хеширования таблиц». Журнал ACM (JACM) 59.3 (2012): 1-50.
  6. ^ Аумюллер, Мартин, Мартин Дитцфельбингер и Филипп Вельфель. «Явных и эффективных хэш-семейств достаточно для кукушкиного хеширования с помощью тайника». Алгоритмика 70.3 (2014): 428-456.
  7. Перейти обратно: Перейти обратно: а б Митценмахер, Майкл (9 сентября 2009 г.). «Некоторые открытые вопросы, связанные с хешированием с кукушкой» (PDF) . Труды ЕКА 2009 . Проверено 10 ноября 2010 г.
  8. ^ Дитцфельбингер, Мартин; Вейдлинг, Кристоф (2007). «Сбалансированное распределение и словари с плотно упакованными ячейками постоянного размера» . Теория. Вычислить. Наука . 380 (1–2): 47–68. дои : 10.1016/j.tcs.2007.02.054 . МР   2330641 .
  9. ^ Кирш, Адам; Митценмахер, Майкл Д.; Видер, Уди (2010). «Более надежное хеширование: хеширование кукушки с тайником». СИАМ Дж. Компьютер . 39 (4): 1543–1561. дои : 10.1137/080728743 . МР   2580539 .
  10. ^ Аумюллер, Мартин; Дитцфельбингер, Мартин; Вельфель, Филипп (2014). «Явных и эффективных хэш-семейств достаточно для кукушкиного хеширования с помощью тайника». Алгоритмика . 70 (3): 428–456. arXiv : 1204.4431 . дои : 10.1007/s00453-013-9840-x . МР   3247374 . S2CID   1888828 .
  11. ^ «Микроархитектура» .
  12. ^ Фан, Бин; Андерсен, Дэйв Г.; Каминский, Майкл; Митценмахер, Майкл Д. (2014), «Фильтр кукушки: практически лучше, чем Блум», Proc. 10-й Международный турнир ACM. Конф. Новые сетевые эксперименты и технологии (CoNEXT '14) , стр. 75–88, doi : 10.1145/2674005.2674994.
  13. ^ Жуковский, Марцин; Хеман, Сандор; Бонч, Питер (июнь 2006 г.). «Хеширование с учетом архитектуры» (PDF) . Материалы международного семинара по управлению данными на новом оборудовании (DaMoN) . Проверено 16 октября 2008 г.
  14. ^ Росс, Кеннет (08 ноября 2006 г.). Эффективные хеш-зонды на современных процессорах (PDF) (отчет об исследовании). ИБМ. RC24100 . Проверено 16 октября 2008 г.
  15. ^ Аскитис, Николас (2009). «Быстрые и компактные хеш-таблицы для целочисленных ключей». Материалы 32-й Австралазийской конференции по информатике (ACSC 2009) (PDF) . Том. 91. стр. 113–122. ISBN  978-1-920682-72-9 . Архивировано из оригинала (PDF) 16 февраля 2011 г. Проверено 13 июня 2010 г.
  16. ^ «Монолит: система рекомендаций, лежащая в основе TikTok» . gantry.io . Проверено 30 мая 2023 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 79b998401ce018dcc1465e23ad9767e5__1721511840
URL1:https://arc.ask3.ru/arc/aa/79/e5/79b998401ce018dcc1465e23ad9767e5.html
Заголовок, (Title) документа по адресу, URL1:
Cuckoo hashing - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)