Открытое хеширование (раздельная цепочка):
При открытом хешировании ключи хранятся в связанных списках, прикрепленных к ячейкам хеш-таблицы.
Закрытое хеширование (открытая адресация):
При закрытом хешировании все ключи хранятся в самой хеш-таблице без использования связанных списков.
Я не могу понять, почему их называют открытыми, закрытыми и отдельными. Кто-нибудь может это объяснить?
Ответы:
Использование словосочетаний «закрыто» и «открыто» отражает то, привязаны ли мы к использованию определенной позиции или структуры данных (это очень расплывчатое описание, но, надеюсь, остальное помогает).
Например, «open» в «открытой адресации» сообщает нам, что индекс (он же адрес), по которому объект будет храниться в хеш-таблице, не полностью определяется его хеш-кодом. Вместо этого индекс может варьироваться в зависимости от того, что уже находится в хеш-таблице.
«Закрытый» в «закрытом хешировании» относится к тому факту, что мы никогда не покидаем хеш-таблицу; каждый объект хранится непосредственно по индексу во внутреннем массиве хеш-таблицы. Обратите внимание, что это возможно только при использовании какой-то открытой стратегии адресации. Это объясняет, почему «закрытое хеширование» и «открытая адресация» являются синонимами.
Сравните это с открытым хешированием - в этой стратегии ни один из объектов фактически не хранится в массиве хеш-таблицы; вместо этого после хеширования объект сохраняется в списке, который отделен от внутреннего массива хеш-таблицы. «открытый» относится к свободе, которую мы получаем, покидая хеш-таблицу и используя отдельный список. Кстати, «отдельный список» намекает, почему открытое хеширование также известно как «отдельная цепочка».
Короче говоря, «закрытый» всегда относится к какой-то строгой гарантии, например, когда мы гарантируем, что объекты всегда хранятся непосредственно в хеш-таблице (закрытое хеширование). Тогда противоположностью «закрыто» является «открыто», поэтому, если у вас нет таких гарантий, стратегия считается «открытой».
источник
У вас есть массив, который является «хеш-таблицей».
В открытом хешировании каждая ячейка в массиве указывает на список, содержащий коллизии. В результате хеширования был получен один и тот же индекс для всех элементов связанного списка.
В закрытом хешировании вы используете только один массив для всего. Вы храните столкновения в одном массиве. Уловка состоит в том, чтобы использовать какой-нибудь умный способ перейти от столкновения к столкновению, если вы найдете то, что хотите. И делайте это воспроизводимым / детерминированным способом.
источник
Имя открытой адресации относится к тому факту , что место ( «адрес») элемент не определяется его хэш - значением. (Этот метод также называется закрытым хешированием).
При отдельной цепочке каждая корзина является независимой и имеет своего рода ADT (список, бинарные деревья поиска и т. Д.) Записей с одинаковым индексом. В хорошей хеш-таблице каждая корзина имеет ноль или одну запись, потому что нам нужны операции порядка O (1) для вставки, поиска и т. Д.
Это пример из отдельной цепочки с использованием C ++ с простой хэш - функции с использованием мод оператора (очевидно, плохой хэш - функции)
источник