Значение открытого и закрытого хеширования

97

Открытое хеширование (раздельная цепочка):

При открытом хешировании ключи хранятся в связанных списках, прикрепленных к ячейкам хеш-таблицы.

Закрытое хеширование (открытая адресация):

При закрытом хешировании все ключи хранятся в самой хеш-таблице без использования связанных списков.

Я не могу понять, почему их называют открытыми, закрытыми и отдельными. Кто-нибудь может это объяснить?

Хариендра Редди
источник
На самом деле мы никогда не храним ключи в хэш-таблицах, мы берем кортеж (Key, Value) и используем ключ для вычисления, где должно храниться значение. На самом деле мы храним значения в хеш-таблице
г-н Сурьяа Джа

Ответы:

118

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

Например, «open» в «открытой адресации» сообщает нам, что индекс (он же адрес), по которому объект будет храниться в хеш-таблице, не полностью определяется его хеш-кодом. Вместо этого индекс может варьироваться в зависимости от того, что уже находится в хеш-таблице.

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

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

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

Кен Уэйн ВандерЛинде
источник
17
Мы должны добавить, что открытое хеширование (раздельная цепочка) не ограничивается связанными списками, которые не подходят для кеширования и при атаках на коллизии переходят в поведение O (n / 2). Вы также можете использовать деревья или отсортированные массивы для сталкивающихся сегментов.
rurban
проголосовали против из-за противоречивой информации: вы сказали, что «открыто» и «закрыто» являются синонимами, а затем в конце: «противоположность« закрыто »- это« открыто »
Марвен Трабелси
1
@MarwenTrabelsi Я никогда не говорил, что «закрытый» и «открытый» - синонимы.
Кен Уэйн ВандерЛинде
«Это объясняет, почему« закрытое хеширование »и« открытая адресация »являются синонимами».
Марвен Трабелси 03
1
Может ли кто-нибудь предоставить источник, доказывающий, что это правильная историческая этимология?
Santropedro 06
3

У вас есть массив, который является «хеш-таблицей».

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

В закрытом хешировании вы используете только один массив для всего. Вы храните столкновения в одном массиве. Уловка состоит в том, чтобы использовать какой-нибудь умный способ перейти от столкновения к столкновению, если вы найдете то, что хотите. И делайте это воспроизводимым / детерминированным способом.

Антон Андреев
источник
2

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

При отдельной цепочке каждая корзина является независимой и имеет своего рода ADT (список, бинарные деревья поиска и т. Д.) Записей с одинаковым индексом. В хорошей хеш-таблице каждая корзина имеет ноль или одну запись, потому что нам нужны операции порядка O (1) для вставки, поиска и т. Д.

Это пример из отдельной цепочки с использованием C ++ с простой хэш - функции с использованием мод оператора (очевидно, плохой хэш - функции)

Д. Перес
источник