Все статьи и конспекты
Хеш-таблицыКоллизииХешированиеСтруктуры данных
1 мин чтение

Хеш-таблицы: Хеш-функции, Разрешение коллизий и Универсальное хеширование

Полное руководство по хеш-таблицам: метод цепочек (Chaining), открытая адресация (линейное, квадратичное пробирование, двойное хеширование), фактор загрузки α, первичная/вторичная кластеризация и универсальные семейства хеш-функций.

Исходная заготовка: полнота объяснения и примеров ожидает редакторской проверки.

Способы разрешения коллизий

1. Метод цепочек (Chaining)

Каждая ячейка таблицы содержит связный список или сбалансированное дерево (как в Java 8+ HashMap при длине цепочки >8> 8). При факторе загрузки α=n/m\alpha = n/m среднее время поиска составляет Θ(1+α)\Theta(1 + \alpha).

2. Открытая адресация (Open Addressing)

Все элементы хранятся непосредственно в массиве таблицы. При коллизии проверяется последовательность проб h(k,0),h(k,1),…,h(k,m−1)h(k, 0), h(k, 1), \dots, h(k, m-1):
  • Линейное пробирование (Linear Probing):
  • h(k,i)=(h′(k)+i) mod mh(k, i) = (h'(k) + i) \bmod m
    Проблема: Первичная кластеризация (длинные непрерывные блоки занятых ячеек).
  • Квадратичное пробирование (Quadratic Probing):
  • h(k,i)=(h′(k)+c1i+c2i2) mod mh(k, i) = (h'(k) + c_1 i + c_2 i^2) \bmod m
    Проблема: Вторичная кластеризация.
  • Двойное хеширование (Double Hashing):
  • h(k,i)=(h1(k)+i⋅h2(k)) mod mh(k, i) = (h_1(k) + i \cdot h_2(k)) \bmod m
    Лучший метод открытой адресации (порождает m!m! перестановок проб при взаимно простых h2(k)h_2(k) и mm).

    Универсальное хеширование (Universal Hashing)

    Семейство H\mathcal{H} хеш-функций называется универсальным, если для любых двух различных ключей x≠yx \ne y:

    Ph∈H[h(x)=h(y)]≤1mP_{h \in \mathcal{H}} [h(x) = h(y)] \le \frac{1}{m}

    Что дальше?

    Закрепите материал задачей: Повторить число.

    Изучено — к практике →

    Отметка сохранится в этом браузере. Её можно отменить или снять кнопкой «Изучено».