✈️31. Хеш-таблицы. Коллизии. Способы разрешения коллизий. Открытая адресация
(линейное пробирование, квадратичное пробирование, двойное хеширование).
Хэш-таблица - структура данных, в которой все элементы хранятся в виде пары "ключ-значение". По-другому, это ассоциативный массив. Самый частный пример хэш-таблицы - словарь.
data_1["BMSTU"] = "МГТУ"
DATA_2[3.14] = "Pi"
Хэширование - процесс преобразования ключа в некоторый индекс с помощью некоторой функции, которую также называют хэш-функцией.
h("a") -> 1
h("b") -> 2
h("c") -> 3
Преимущества хэш-таблиц:
Сложность алгоритма: О(n)
Быстрый поиск
Равномерное распределение в памяти
Недостатки хэш-таблиц:
Зачастую возникают проблемы в связи с ограниченностью размера типа данных "значений". Количество ключей и количество значений может не совпадать, из-за этого возникает коллизия хэш-функций.
Коллизия хэш-функции - получение одинакового индекса для разных ключей.
Существует 2 основных типа борьбы с коллизиями:
Метод цепочек
Открытая адресация(3 типа)
Линейное зондирование(пробирование) Линейное опробование сводится к последовательному перебору сегментов таблицы с некоторым фиксированным шагом
h'(k, i) = (h(k) + i) % size;
Минус: метод приводит к образованию кластеров (когда несколько ячеек подряд заняты). Кластер приводит к тому, что увеличивается время доступа к данным.
Квадратичное зондирование(пробирование)
Квадратичное опробование отличается от линейного тем, что шаг перебора сегментов нелинейно зависит от номера попытки найти свободный сегмент:
h'(k, i) = (h(k) + a*i + b*i*i) % size;
Минус: относительно небольшое число проб может быстро привести к выходу за адресное пространство небольшой таблицы вследствие квадратичной зависимости адреса от номера попытки.
Двойное хеширование
Двойное хеширование основано на нелинейной адресации, достигаемой за счет суммирования значений основной и дополнительной хеш-функций
h'(k, i) = (h1(k) + i*h2(k)) % size;
Минус: нерациональное использование огромного количества памяти.
Last updated