Как работает хеш таблица
Хеш-таблица это разреженный массив (массив, в котором имеются незаполненные позиции). В стандартных англоязычных учебниках ячейки хеш-таблицы называются "bucket". В хеш-таблице dict каждому элементу соотвествует ячейка, содержащая два поля: ссылку на ключ и ссылку на значение элемента. Поскольку размер всех ячеек одинаков, доступ к отдельной ячейке производится по смещению.
Python стремится оставить не менее трети ячеек пустыми; если хеш-таблица становится чрезмерно заполненной, то она копируется в новый участок памяти, где есть место для большего числа ячеек.
Для помещения элемента в хеш-таблицу нужно первым делом вычислить хеш-значение ключа элемента. Это делает встроенная функция hash()
.
Для выборки значения с помощью выражения my_dict[search_key]
Python обращается к функции hash(search_key)
, чтобы получить хеш-значение search_key, и использует несколько младших битов полученного числа как смещение ячейки относительно начала хеш-таблицы (сколько именно битов зависит от текущего размера таблицы). Если найденная ячейка пуста, возбуждается исключение KeyError
. В противном случае, в найденной ячейке есть какой-то элемент - пара ключ:значение
- и тогда Python проверяет, верно ли то, что search_key == found_key. Если да, то элемент найден и возвращается found_value. Если же search_key и found_key не совпали, то имеет место коллизия хеширования. Для разрешения коллизии алгоритм берет различные биты хеш-значения, производит над ними определенные действия и использует результат как смещение другой ячейки.
Oct. 12, 2023, Источник
Хеш-таблица содержит некоторый массив из пар ключ-значение. Хеш-функция преобразует ключ в уникальный хеш, и далее этот хеш становится индексом для записи в таблицу.
Oct. 12, 2023, Источник
Хеш-таблица (hash table) - это структура данных, которая использует хэш-функцию для быстрого поиска, вставки и удаления элементов. В основе ее работы лежит идея преобразования ключей элементов в числовые значения (хэши), которые затем используются для определения местоположения элементов в таблице.
Вот основные шаги работы:
1. Хэширование ключей: Каждый ключ элемента преобразуется в числовое значение с помощью хэш-функции. Она берет ключ и преобразует его в индекс (хэш), который указывает на ячейку или слот в массиве.
2. Разрешение коллизий: Поскольку разные ключи могут быть преобразованы в один и тот же хэш (коллизия), необходимо иметь механизм разрешения коллизий. Существуют различные методы разрешения коллизий, такие как метод цепочек (chaining) и метод открытой адресации (open addressing).
- Метод цепочек: В этом методе каждая ячейка представляет собой связный список элементов с одним и тем же хэшем. При коллизии элемент добавляется в соответствующий список.
- Метод открытой адресации: В нем, если возникает коллизия, ищется следующая свободная ячейка в таблице (обычно с помощью другой хэш-функции или последовательного поиска), где элемент может быть помещен.
3. Доступ к элементам: Для доступа к элементу нужно выполнить следующее:
- Применить хэш-функцию к ключу, чтобы определить индекс в таблице.
- В ячейке таблицы есть элемент(ы), сравнить ключ(и) с искомым.
- Ключ совпадает, элемент найден.
- Ключ не совпадает, применить метод разрешения коллизий для поиска элемента.
4. Вставка и удаление элементов: Процесс вставки и удаления элементов аналогичен процессу доступа к элементам. Сначала вычисляется хэш ключа, затем используется метод разрешения коллизий для вставки или удаления элемента.
Хеш-таблицы обеспечивают быстрый доступ к элементам в среднем случае за время O(1), что делает их эффективным инструментом для реализации ассоциативных массивов, множеств и других структур данных, требующих эффективного поиска, вставки и удаления элементов.
Feb. 18, 2024, easyoffer