Хеш-таблица (или ассоциативный массив, словарь) — это структура данных, которая хранит пары ключ-значение и обеспечивает быстрый доступ к значению по его ключу.
Основные компоненты и принцип работы:
Массив (Buckets): Основное хранилище данных, представляющее собой массив определенного размера. Каждый элемент этого массива называется "ведром" (bucket) или "слотом".
Хеш-функция: Преобразует ключ в числовое значение (хеш-код). Хорошая хеш-функция распределяет ключи равномерно по хеш-кодам.
Индексирование: Хеш-код, полученный от хеш-функции, используется для определения индекса в массиве, где будет храниться или извлекаться значение, соответствующее данному ключу. Часто используется операция по модулю (хеш_код % размер_массива) для получения индекса в диапазоне от 0 до размер_массива - 1.
Разрешение коллизий: Поскольку разные ключи могут иметь одинаковый хеш-код (хеш-коллизия), хеш-таблица должна иметь механизм их разрешения. Два основных подхода:
Процесс вставки (put):
Процесс извлечения (get):
Процесс удаления (delete):
Пример (концептуальный):
Предположим, у нас есть небольшой массив из 5 ведер, и мы используем метод цепочек.
| Ключ | Хеш-функция | Индекс (хеш % 5) | Ведро |
|---|---|---|---|
| "apple" | \approx 110 | 110 \% 5 = 0 | Ведро 0: [("apple", "red")] |
| "banana" | \approx 221 | 221 \% 5 = 1 | Ведро 1: [("banana", "yellow")] |
| "cherry" | \approx 332 | 332 \% 5 = 2 | Ведро 2: [("cherry", "red")] |
| "date" | \approx 115 | 115 \% 5 = 0 | Ведро 0: [("apple", "red"), ("date", "brown")] |
При поиске "date", хеш-функция дает хеш-код \approx 115, индекс 0. Переходим к Ведру 0 и просматриваем список, пока не найдем ключ "date".
Эффективность хеш-таблиц сильно зависит от качества хеш-функции и коэффициента заполнения (отношение количества элементов к размеру массива). В идеальном случае (без коллизий) операции вставки, извлечения и удаления выполняются в среднем за время O(1). В худшем случае (все хешируются в одно ведро) время может деградировать до O(n), где n — количество элементов.
В Python хеш-таблица реализована в типе данных dict.
python