Хеш-таблицы

Хеш-таблицы

План

  1. задача и применение
  2. неконстантные решения
  3. хеширование
  4. коллизии
  5. анализ сложности с допущениями
  6. без допущений

Задача и применение

Задача и применение

Есть множество пар \((k, v)\) — ключ-значение. Необходимо построить структуру хранения этих пар так, чтобы на ней были определены операции:

Неконстантные решения

Неконстантные решения

Хеширование

Хеширование

Выделим массив для хранения пар размера \(N\), при этом допустимое множество ключей \(K\) такое, что \(|K| \gg N\). Определим функциональное отображение

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

Коллизии

Коллизии

Так как \(|K| \gg N\), то существуют \(k\) и \(k^\prime\) такие, что \(h(k) = h(k^\prime)\). Это называется коллизия.

Методы разрешения коллизий

Прямое связывание

В массиве хранятся указатели на списки, в которых может быть несколько элементов.

Разрешение коллизий прямым связыванием

Прямое связывание

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

Определим функцию \(h(k, i)\), где \(i \in \natnums\) — номер попытки. При возникновении коллизии будем увеличивать номер попытки.

Метод линейных проб

Разрешение коллизий открытой адресацией с линейными пробами

Преимущества: локальность данных.

Недостатки: удаление, рехеширование при переполнении.

Метод квадратичных проб

Общий случай

где \(g(k)\) равномерно распределено.

Для избежания коллизии по попыткам \(h(k, i) = h(k, j)\) для \(i \neq j\), достаточно, чтобы \(g(k) \perp N\). Достаточно чтобы \(N\) было простым.

Анализ сложности

Анализ сложности

Предположим, что \(h\colon K \to N\) — случайная величина с равномерным распределением.

Прямое связывание

Пусть искомый ключ находится в конце цепочки длинны \(L\). Тогда сложность его нахождения равна:

Определим функцию коллизии следующим образом:

Прямое связывание

Перейдём к мат. ожиданию:

Тогда

Метрика хеш-таблицы

Коэффициент \(\alpha = n / N\) называется коэффициентом заполнения.

Прямое связывание

Обозначим через \(p_i\) вероятность того, что потребуется \(i\) проб для вставки:

Прямое связывание

Перейдём к мат. ожиданию:

Прямое связывание

Аналогично можно посчитать мат. ожидание сложности операции get

где \(\mathrm{get}_i\) — вставка \(i\)-го ключа, то есть

где \(H_i = \ln i + \gamma\) — гармоническая функция (\(\gamma\) — постоянная Эйлера).

Прямое связывание

Таким образом,

К цифрам

\(\alpha\) Общий сл. Лин. пробы
0.1 1.05 1.06
0.25 1.15 1.17
0.5 1.39 1.5
0.75 1.85 2.5
0.9 2.56 5.5
0.95 3.15 10.5
0.99 4.66

Анализ сложности

Для метода линейных проб получаем

Без допущений

Без допущений

\(h\colon K \to N\) — случайные величины.

Пусть \(\mathscr H = {h\colon K \to N}\) — некоторое семейство хеш-функций. И пусть существует равномерная вероятностная мера выбора \(h \in \mathscr H\).

Для сохранения оценок \(ET(\mathrm{get / set}) = O(1 + \alpha)\) необходимо, чтобы

Без допущений

То есть мы переносим рандомизацию с построения \(h(k)\) на выбор \(h \in \mathscr H\).

Без допущений

Без допущений

Без ограничения общности будем считать, что \(K \subset {0, \ldots, p - 1}\), где \(p\) — простое число. Тогда

То есть выбор \(h\) сводится к выбору \(a\) и \(b\).