Files
hello-algo/ru/docs/chapter_hashing/hash_collision.md
2026-01-20 15:08:42 +08:00

6.5 KiB
Raw Permalink Blame History

Хеш-коллизии

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

Хеш-коллизии могут привести к ошибкам в результатах запросов, серьезно влияя на работоспособность хеш-таблицы. Чтобы решить эту проблему, при возникновении хеш-коллизий выполняется увеличение емкости хеш-таблицы до тех пор, пока коллизии не исчезнут. Этот метод понятен и прост в реализации, но крайне неэффективен, поскольку увеличение емкости хеш-таблицы требует значительных затрат на перенос данных и вычисление хеш-значений. Для повышения эффективности можно использовать следующие стратегии:

  1. Улучшение структуры данных хеш-таблицы, чтобы она могла нормально функционировать при возникновении хеш-коллизий.
  2. Выполнение увеличения емкости только при необходимости, т. е. когда хеш-коллизии становятся достаточно серьезными.

Основные методы улучшения структуры хеш-таблицы включают цепную адресацию и открытую адресацию.

Цепная адресация

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

Хеш-таблица с цепной адресацией

Методы работы с хеш-таблицей, реализованной на основе цепной адресации, изменяются следующим образом.

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

Цепная адресация имеет следующие ограничения.

  • Увеличение занимаемого пространства: связный список содержит указатели на узлы, что требует больше памяти по сравнению с массивом.
  • Снижение эффективности поиска: поскольку необходимо линейно обходить список для поиска соответствующего элемента.
[file]{hash_map_chaining}-[class]{hash_map_chaining}-[func]{}

Открытая адресация

Линейная проба

Квадратичная проба

Множественное хеширование

Выбор языка программирования