Что означает «записи в корзине» в контексте хеш-таблицы? - PullRequest
18 голосов
/ 31 января 2012

Что означает «записи в корзине» в контексте хеш-таблицы?

Ответы [ 4 ]

24 голосов
/ 31 января 2012

Сегмент - это просто место быстрого доступа (например, индекс массива), являющееся результатом хеш-функции.

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

Рассмотрим следующую хеш-функцию для отображения имен людей в уличные адреса.

Сначала возьмите инициалы из имени и фамилии и превратите их в числовые значения (от 0 до 25, от «A» до «Z»). Умножьте первое на 26 и добавьте второе, и это даст вам значение от 0 до 675 (26 * 26 различных значений или идентификаторов сегментов). Этот идентификатор корзины затем используется для хранения или извлечения информации.


Теперь вы можете иметь совершенный хэш (где каждое допустимое входное значение отображается на отличный идентификатор корзины), так что для блоков будет достаточно простого массива. В этом случае вы можете просто сохранить массив из 676 уличных адресов и использовать идентификатор корзины, чтобы найти нужный:

+-------------------+
| George Washington | -> hash(GW)
+-------------------+      |
                           +-> GwBucket[George's address]
+-------------------+
|  Abraham Lincoln  | -> hash(AL)
+-------------------+      |
                           +-> AlBucket[Abe's address]

Однако это означает, что Джордж Вендт и Аллан Лангер будут вызывать проблемы в будущем.


Или у вас может быть несовершенный хеш (например, такой, где Джон Смит и Джейн Сеймур получат одинаковый идентификатор корзины).

В этом случае вам нужна более сложная структура данных поддержки, чем простой массив, чтобы поддерживать набор адресов. Это может быть как простой список, так и сложный другой хеш:

+------------+       +--------------+
| John Smith |       | Jane Seymour |
+------------+       +--------------+
      |                     |
      V                     V
   hash(JS)              hash(JS)
      |                     |
      +-----> JsBucket <----+
                 \/
+-----------------------------------+
| "John Smith   -> [John's address] |
| "Jane Seymour -> [Jane's address] |
+-----------------------------------+

Затем, наряду с начальным поиском по хешу, необходимо выполнить дополнительный уровень поиска внутри самого блока, чтобы найти конкретную информацию.

9 голосов
/ 31 января 2012

С Википедия :

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

enter image description here

Каждая запись в массиве / векторе называется Bucket.

1 голос
/ 06 июля 2018

Я думаю, Bucket - это структура, которая, по крайней мере, содержит хеш-значение, которое работает как индексы (хеш-значения генерируются хеш-функциями), но сама структура может содержать записи (данные) или нет.

иллюстрация:

[значение хеш-функции] [указывает на фактические данные] ---> [фактические данные]
| <------------ ведроструктура ------> |

[значение хеша] [фактические данные]
| ----- структура корзины ---> |

Это [хешvalue] part работает как индексы.


Я нашел эти фотографии из hash_table Wikipedia довольно просты.

На фотографиях ниже показано, что записи (данные) могут бытьхранится в корзинах или может быть сохранен со своей собственной структурой данных, тогда как корзина просто указывает на данные.

enter image description here enter image description here enter image description here

0 голосов
/ 14 марта 2018

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

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

Предположим, что хеш-функция выдает значения между 0 и размером таблицы - 1. Затем объявляется корзина массива узлов заголовка таблицы размеров. Этот массив называется хеш-таблица .

Bucket [i] , запись ведра, указывает на список всех записей, которые хешируют в i. Для вставки записи осуществляется доступ к заголовку списка [i], и запись вставляется в хвостовой части.

...