Открыть сервис

Хеш-таблица

Хеш-таблица (также хэш-таблица, от англ. hash table) — это структура данных, реализующая интерфейс ассоциативного массива, то есть позволяющая хранить пары «ключ — значение» и выполнять операции добавления, поиска и удаления элемента по ключу. Основная идея хеш-таблицы заключается в использовании хеш-функции, которая преобразует ключ в индекс массива (слот), где хранится соответствующее значение. Благодаря этому время выполнения операций в среднем составляет O(1), что делает хеш-таблицы одной из наиболее эффективных структур для организации быстрого доступа к данным.

Принцип работы

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

При поиске элемента по ключу процесс повторяется: вычисляется хеш, определяется индекс, и проверяется содержимое соответствующего слота. Если ключ совпадает, значение возвращается. Если нет — возникает коллизия (см. ниже).

Хеш-функции

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

Примеры простых хеш-функций для строк:

Коллизии и методы их разрешения

Коллизия возникает, когда два разных ключа дают одинаковый индекс в таблице. Поскольку размер таблицы конечен, коллизии неизбежны. Существует два основных подхода к их разрешению:

Метод цепочек (открытое хеширование)

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

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

Все элементы хранятся непосредственно в массиве. При коллизии алгоритм последовательно проверяет другие ячейки таблицы (зондирование) до тех пор, пока не найдёт свободную. Существует несколько стратегий зондирования:

При удалении элементов в открытой адресации нельзя просто очищать ячейку — это нарушит цепочки зондирования. Вместо этого ячейки помечаются специальным флагом (deleted).

Коэффициент заполнения и рехеширование

Коэффициент заполнения (load factor) — отношение числа хранимых элементов к размеру таблицы. При увеличении коэффициента растёт вероятность коллизий и, соответственно, время операций. Когда коэффициент превышает некоторый порог (обычно 0,7–0,75), таблица расширяется: создаётся новый массив большего размера (часто вдвое), и все существующие элементы заново вставляются в него с использованием новой хеш-функции (привязанной к новому размеру). Этот процесс называется рехешированием и может быть затратным по времени, но происходит редко.

Реализации в языках программирования

Хеш-таблицы являются встроенной или стандартной структурой данных во многих языках:

Применение

Хеш-таблицы широко используются в программировании и информатике благодаря высокой скорости операций:

Преимущества и недостатки

Преимущества

Недостатки

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →