stringtranslate.com

Классики хэширование

Хеширование Hopscotch. Здесь H равно 4. Серые записи заняты. В части (a) элемент x добавляется со значением хэша 6. Линейный зонд обнаруживает, что запись 13 пуста. Поскольку 13 находится более чем на 4 записи от 6, алгоритм ищет более раннюю запись для обмена с 13. Первое место для поиска — H −1 = 3 записи до, на записи 10. Битовая карта информации о переходе этой записи указывает, что d , элемент на записи 11, может быть перемещен на 13. После перемещения d запись 11 все еще слишком далеко от записи 6, поэтому алгоритм проверяет запись 8. Битовая карта информации о переходе указывает, что элемент c на записи 9 может быть перемещен на запись 11. Наконец, a перемещается на запись 9. Часть (b) показывает состояние таблицы непосредственно перед добавлением x .

Хеширование по методу «классики» — это схема в компьютерном программировании для разрешения коллизий хэшей значений хэш-функций в таблице с использованием открытой адресации . Она также хорошо подходит для реализации параллельной хэш-таблицы . Хеширование по методу «классики» было введено Морисом Херлихи , Ниром Шавитом и Мораном Цафриром в 2008 году. [1] Название происходит от последовательности скачков, которые характеризуют алгоритм вставки таблицы (см. игру «классики» для детей).

Алгоритм использует один массив из n блоков. Для каждого блока его окрестность представляет собой небольшую коллекцию из H последовательных блоков (т. е. тех, индексы которых близки к исходному хэшированному блоку). Желаемое свойство блока заключается в том, что стоимость поиска элемента в блоках блока близка к стоимости поиска его в самом блоке (например, если блоки в блоке попадают в одну и ту же строку кэша ). Размер блока должен быть достаточным для размещения логарифмического числа элементов в худшем случае (т. е. он должен вмещать log( n ) элементов), но только постоянное число в среднем. Если некоторое блоковое соседство заполнено, таблица изменяет размер.

В хешировании классиков, как и в хешировании кукушки , и в отличие от линейного зондирования , заданный элемент всегда будет вставлен и найден в окрестности его хешированного контейнера. Другими словами, он всегда будет найден либо в его исходной записи хешированного массива, либо в одной из следующих H −1 соседних записей. H может, например, быть 32, общим размером машинного слова. Таким образом, соседство является «виртуальным» контейнером, который имеет фиксированный размер и перекрывается со следующими H −1 контейнерами. Для ускорения поиска каждый контейнер (элемент массива) включает слово «информации о переходе», битовую карту H , которая указывает, какие из следующих H −1 записей содержат элементы, которые хэшируются в виртуальный контейнер текущей записи. Таким образом, элемент можно быстро найти, посмотрев на слово, чтобы увидеть, какие записи относятся к контейнеру, а затем просканировав постоянное количество записей (большинство современных процессоров поддерживают специальные операции по обработке битов, которые делают поиск в битовой карте «информации о переходе» очень быстрым).

Вот как добавить элемент x , который был хэширован, в контейнер i :

  1. Если слово с информацией о переходе для контейнера i показывает, что в этом контейнере уже есть H элементов, таблица заполнена; разверните хэш-таблицу и повторите попытку.
  2. Начиная с записи i , используйте линейный зонд, чтобы найти пустую запись с индексом j . (Если пустых ячеек нет, таблица заполнена.)
  3. Пока ( ji ) mod nH , переместите пустой слот в сторону i следующим образом:
    1. Поиск H −1 слотов, предшествующих j, для элемента y, хэш-значение k которого находится в пределах H −1 от j , т. е. ( jk ) mod n < H. (Это можно сделать с помощью слов с информацией о переходе.)
    2. Если в диапазоне нет такого элемента y , таблица заполнена.
    3. Переместите y в j , создав новый пустой слот ближе к i .
    4. Установите j в пустую ячейку, освобожденную y , и повторите.
  4. Сохраните x в слоте j и верните.

Идея заключается в том, что хеширование классиков «перемещает пустой слот в нужное ведро». Это отличает его от линейного зондирования , которое оставляет пустой слот там, где он был найден, возможно, далеко от исходного ведра, или от хеширования кукушки , которое для создания свободного ведра перемещает элемент из одного из нужных ведер в целевых массивах и только затем пытается найти перемещенный элемент на новом месте.

Чтобы удалить элемент из таблицы, нужно просто удалить его из записи таблицы. Если соседние контейнеры кэшированы, можно применить операцию реорганизации, в которой элементы перемещаются в теперь свободное место, чтобы улучшить выравнивание.

Одним из преимуществ хеширования по методу классиков является то, что оно обеспечивает хорошую производительность при очень высоких коэффициентах загрузки таблицы, даже превышающих 0,9. Частично эта эффективность обусловлена ​​использованием линейного зонда только для поиска пустого слота во время вставки, а не для каждого поиска, как в исходном алгоритме линейного зондирования хеш-таблицы. Другое преимущество заключается в том, что можно использовать любую хеш-функцию, в частности простые, близкие к универсальным.

Варианты

В статье также представлены несколько вариантов схемы хеширования «классики». [1]

Расширенный подход использует схему указателя для реализации слова информации о переходе (в базовом случае это битовая карта информации о переходе ). Это позволяет слову информации о переходе иметь произвольный (но фиксированный) размер.

Хотя базовый случай и расширенный подход разработаны как последовательные , для каждого из них также существует параллельный вариант.

Вариант без блокировки был представлен Робертом Келли, Бараком А. Перлмуттером и Филом Магуайром в 2020 году. [2]

Смотрите также

Ссылки

  1. ^ ab Herlihy, Maurice; Shavit, Nir; Tzafrir, Moran (2008). "Hopscotch Hashing" (PDF) . DISC '08: Труды 22-го международного симпозиума по распределенным вычислениям . Аркашон, Франция: Springer-Verlag. стр. 350–364. Архивировано из оригинала (PDF) 2022-12-20.
  2. ^ Келли, Роберт; Перлмуттер, Барак А.; Магуайр, Фил (2020). «Хеширование в классики без блокировок». Симпозиум по алгоритмическим принципам компьютерных систем (APOCS) : 45–59. doi :10.1137/1.9781611976021 – через SIAM.

Внешние ссылки