Хеш-таблицы

…

Хеш-таблицы

План

  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\).