Идеальное хеширование — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Первый уровень)
(Второй уровень)
Строка 14: Строка 14:
  
 
=== Второй уровень ===
 
=== Второй уровень ===
На данном уровне будет использовать вторичную хеш-таблицу <tex>S_j</tex> со своей функций <tex>h_j</tex>. <tex>S_j</tex> будет хранить все ключи, хешированные в ячейку <tex>j</tex>. Соответственно, хеш-функция будет вида <tex>h_j((a_j\cdot k + b_j) \mod p) \mod m_j</tex>.<br>
+
На данном уровне будет использовать вторичную хеш-таблицу <tex>S_j</tex> со своей функций <tex>h_j</tex>. <tex>S_j</tex> будет хранить все ключи, хешированные в ячейку <tex>j</tex>. Соответственно, хеш-функция будет вида <tex>h_j((a_j\cdot k + b_j) \bmod p) \bmod m_j</tex>.<br>
  
 
Благодаря такому подходу, так как ни в одной из вторичных таблиц нет ни одной коллизии, время поиска в худшем случае будет равно константе. Но для того, чтобы гарантировать отсутствие коллизий на втором уровне, требуется, чтобы размер <tex>m_j</tex> хеш-таблицы <tex>S_j</tex> был равен квадрату числа <tex>n_j</tex> ключей, хешированных в ячейку <tex>j</tex>.
 
Благодаря такому подходу, так как ни в одной из вторичных таблиц нет ни одной коллизии, время поиска в худшем случае будет равно константе. Но для того, чтобы гарантировать отсутствие коллизий на втором уровне, требуется, чтобы размер <tex>m_j</tex> хеш-таблицы <tex>S_j</tex> был равен квадрату числа <tex>n_j</tex> ключей, хешированных в ячейку <tex>j</tex>.
 +
 
== Метод №1 ==
 
== Метод №1 ==
 
Будем использовать <tex>O(n^2)</tex> памяти.
 
Будем использовать <tex>O(n^2)</tex> памяти.

Версия 09:40, 13 июня 2013

Определение:
Идеальная хеш-функцияхеш-функция, которая без коллизий отображает различные элементы из множества объектов на множество ключей за O(1) времени в худшем случае.


Практический смысл

Задача идеального хеширования возникает тогда, когда возникает необходимость проверять наличие элемента (скажем, слова из словаря) за гарантировано константное время. При этом подразумевается, что набор данных в таблице статичен либо изменяется очень редко.

Основная идея

Будем использовать двухуровневую схему хеширования с универсальным хешированием на каждом уровне.

Первый уровень

Используется тот же принцип, что и в случае хеширования с цепочками: n ключей хешируются в m ячеек с использованием хеш-функции h, выбранной из семейства универсальных хеш-функций. Сама хеш-функция будет иметь вид h(k)=((ak+b)modp).

Второй уровень

На данном уровне будет использовать вторичную хеш-таблицу Sj со своей функций hj. Sj будет хранить все ключи, хешированные в ячейку j. Соответственно, хеш-функция будет вида hj((ajk+bj)modp)modmj.

Благодаря такому подходу, так как ни в одной из вторичных таблиц нет ни одной коллизии, время поиска в худшем случае будет равно константе. Но для того, чтобы гарантировать отсутствие коллизий на втором уровне, требуется, чтобы размер mj хеш-таблицы Sj был равен квадрату числа nj ключей, хешированных в ячейку j.

Метод №1

Будем использовать O(n2) памяти.

Теорема:
Если n ключей сохраняются в хеш-таблице размером m=n2 c использованием хеш-функции h, случайно выбранный из универсального множества хеш-функций, то вероятность возникновения коллизий не превышает 12.
Доказательство:

Всего имеется (n2) пар ключей, которые могут вызвать коллизию. Если хеш-функция выбрана случайным образом из универсального семейства хеш-функций H, то для каждой пары вероятность возникновения коллизии равна 1m. Пусть Xслучайная величина, которая подсчитывает количество коллизий. Если m=n2, то математическое ожидание числа коллизий равно

E[X]= (n2)1n2=n2nn1n2<12

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

Метод №2

Будем использовать O(n) памяти.

Теорема:
Если мы сохраняем n ключей в хеш-таблице в хеш-таблице размеров m=n c использованием хеш-функции h, выбираемой случайным образом из универсального множества хеш-функций, то E[m1j=0n2j]<2n, где nj — количество ключей, хешированных в ячейку j.
Доказательство:

E[m1j=0n2j]= E[m1j=0(nj+2(nj2))]= E[m1j=0nj]+2E[m1j=0(nj2)]= E[n]+2E[m1j=0(nj2)]=n+2E[m1j=0(nj2)]

Первый переход в равенстве мы совершили благодаря формуле a2=a+2(a2). Далее мы воспользовались свойствами математического ожидания, в частности - линейности.

Очевидно, что m1j=0(nj2) - просто общее количество коллизий, поэтому по свойству универсального хеширования математическое ожидание значения этой суммы не превышает (n2)1m=n(n1)2m=n12 А так как m=n, то

E[m1j=0n2j] n + 2 \cdot {n-1 \over 2} = 2n - 1 \lt 2n, ч.т.д.
\triangleleft

Теперь выведем 2 следствия из этой теоремы.

Теорема:
Если мы сохраняем n ключей в хеш-таблице размером m=n с использованием хеш-функции h, выбираемой случайным образом из универсального множества хеш-функций, и устанавливаем размер каждой вторичной хеш-таблицы равным m_j=n_j^2 (j=0,1,...,m-1), то математическое ожидание количества необходимой для вторичных хеш-таблиц в схеме идеального хеширования памяти не превышает 2n.
Доказательство:
\triangleright

Поскольку m_j=n_j^2 для j=0,1,...,m-1, согласно предыдущей теореме:

E\left[\displaystyle \sum_{j=0}^{m-1} m_j \right] = E\left[\displaystyle \sum_{j=0}^{m-1} n_j^2 \right] \lt 2n, ч.т.д.
\triangleleft
Теорема:
Если мы сохраняем n ключей в хеш-таблице размером m=n с использованием хеш-функции h, выбираемой случайным образом из универсального множества хеш-функций, и устанавливаем размер каждой вторичной хеш-таблицы равным m_j=n_j^2 (j=0,1,...,m-1), то вероятность того, что общее количество необходимой для вторичных хеш-таблиц памяти не менее 4n, меньше чем 1/2.
Доказательство:
\triangleright

Применим неравенство Маркова P(X \geqslant t) \leqslant E[X]/t

Пусть X=\displaystyle \sum_{j=0}^{m-1} m_j и t=4n.

Тогда P \left \{\displaystyle \sum_{j=0}^{m-1} m_j \geqslant 4n \right \} \leqslant E\left[\displaystyle\sum_{j=0}^{m-1} mj\right] {1 \over 4n} \lt {2n \over 4n} = {1 \over 2}, ч.т.д.
\triangleleft

См. также

Ссылки