Идеальное хеширование — различия между версиями
Kabanov (обсуждение | вклад) (→Метод №2) |
Shersh (обсуждение | вклад) |
||
Строка 23: | Строка 23: | ||
Если <tex>n</tex> ключей сохраняются в хеш-таблице размером <tex>m=n^2</tex> c использованием хеш-функции <tex>h</tex>, случайно выбранный из [[Универсальное_семейство_хеш-функций | универсального множества хеш-функций]], то вероятность возникновения коллизий не превышает <tex dpi="180">{1 \over 2}</tex>. | Если <tex>n</tex> ключей сохраняются в хеш-таблице размером <tex>m=n^2</tex> c использованием хеш-функции <tex>h</tex>, случайно выбранный из [[Универсальное_семейство_хеш-функций | универсального множества хеш-функций]], то вероятность возникновения коллизий не превышает <tex dpi="180">{1 \over 2}</tex>. | ||
|proof= | |proof= | ||
− | Всего имеется <tex>\dbinom{n}{2}</tex> пар ключей, которые могут вызвать коллизию. Если хеш-функция выбрана случайным образом из [[Универсальное_семейство_хеш-функций | универсального семейства хеш-функций]] H, то для каждой пары вероятность возникновения коллизии равна <tex dpi="180">{1 \over m}</tex>. Пусть <tex>X</tex> - [[Дискретная_случайная_величина |случайная величина]], которая подсчитывает количество коллизий. Если <tex>m = n^2</tex>, то [[Математическое_ожидание_случайной_величины | математическое ожидание]] числа коллизий равно | + | Всего имеется <tex>\dbinom{n}{2}</tex> пар ключей, которые могут вызвать коллизию. Если хеш-функция выбрана случайным образом из [[Универсальное_семейство_хеш-функций | универсального семейства хеш-функций]] <tex>H</tex>, то для каждой пары вероятность возникновения коллизии равна <tex dpi="180">{1 \over m}</tex>. Пусть <tex>X</tex> {{---}} [[Дискретная_случайная_величина |случайная величина]], которая подсчитывает количество коллизий. Если <tex>m = n^2</tex>, то [[Математическое_ожидание_случайной_величины | математическое ожидание]] числа коллизий равно |
<tex>E[X] = </tex> <tex dpi="180"> \binom{n}{2} \cdot {1 \over n^2} = {n^2-n \over n} \cdot {1 \over n^2} < {1 \over 2}</tex> | <tex>E[X] = </tex> <tex dpi="180"> \binom{n}{2} \cdot {1 \over n^2} = {n^2-n \over n} \cdot {1 \over n^2} < {1 \over 2}</tex> | ||
}} | }} | ||
− | Это является очень хорошим результатом, если хотя бы вспомнить на примере [ | + | Это является очень хорошим результатом, если хотя бы вспомнить на примере [[Хеш-таблица#Введение | парадокса дней рождения]] о том, что вероятность коллизий растет крайне быстро по сравнению с размером хеш-таблицы. |
== Метод №2 == | == Метод №2 == | ||
Строка 32: | Строка 32: | ||
{{Теорема | {{Теорема | ||
|statement= | |statement= | ||
− | Если мы сохраняем <tex>n</tex> ключей в хеш-таблице в хеш-таблице размеров <tex>m=n</tex> c использованием хеш-функции <tex>h</tex>, выбираемой случайным образом из универсального множества хеш-функций, то <tex>E\left[\displaystyle \sum_{j=0}^{m-1} n_j^2 \right] < 2n</tex>, где <tex>n_j</tex> - количество ключей, хешированных в ячейку <tex>j</tex>. | + | Если мы сохраняем <tex>n</tex> ключей в хеш-таблице в хеш-таблице размеров <tex>m=n</tex> c использованием хеш-функции <tex>h</tex>, выбираемой случайным образом из универсального множества хеш-функций, то <tex>E\left[\displaystyle \sum_{j=0}^{m-1} n_j^2 \right] < 2n</tex>, где <tex>n_j</tex> {{---}} количество ключей, хешированных в ячейку <tex>j</tex>. |
|proof= | |proof= | ||
<tex>E\left[\displaystyle \sum_{j=0}^{m-1} n_j^2 \right] =</tex> <tex> E\left[ \displaystyle \sum_{j=0}^{m-1} (n_j + 2 \dbinom{n_j}{2})\right] = </tex> <tex> E\left[ \displaystyle \sum_{j=0}^{m-1} n_j\right] + 2E\left[\displaystyle \sum_{j=0}^{m-1} \dbinom{n_j}{2}\right] = </tex> <tex> E\left[n\right] + 2E\left[\displaystyle \sum_{j=0}^{m-1} \dbinom{n_j}{2}\right] = n + 2E\left[\displaystyle \sum_{j=0}^{m-1} \dbinom{n_j}{2} \right]</tex> | <tex>E\left[\displaystyle \sum_{j=0}^{m-1} n_j^2 \right] =</tex> <tex> E\left[ \displaystyle \sum_{j=0}^{m-1} (n_j + 2 \dbinom{n_j}{2})\right] = </tex> <tex> E\left[ \displaystyle \sum_{j=0}^{m-1} n_j\right] + 2E\left[\displaystyle \sum_{j=0}^{m-1} \dbinom{n_j}{2}\right] = </tex> <tex> E\left[n\right] + 2E\left[\displaystyle \sum_{j=0}^{m-1} \dbinom{n_j}{2}\right] = n + 2E\left[\displaystyle \sum_{j=0}^{m-1} \dbinom{n_j}{2} \right]</tex> |
Версия 20:55, 10 июня 2013
Определение: |
Идеальная хеш-функция — хеш-функция, которая без коллизий отображает различные элементы из множества объектов на множество ключей за времени в худшем случае. |
Содержание
Практический смысл
Задача идеального хеширования возникает тогда, когда возникает необходимость проверять наличие элемента (скажем, слова из словаря) за гарантировано константное время. При этом подразумевается, что набор данных в таблице статичен либо изменяется очень редко.
Основная идея
Будем использовать двухуровневую схему хеширования с универсальным хешированием на каждом уровне.
Первый уровень
Используется тот же принцип, что и в случае хеширования с цепочками: семейства универсальных хеш-функций. Сама хеш-функция будет иметь вид .
ключей хешируются в ячеек с использованием хеш-функции , выбранной изВторой уровень
На данном уровне будет использовать вторичную хеш-таблицу
Благодаря такому подходу, так как ни в одной из вторичных таблиц нет ни одной коллизии, время поиска в худшем случае будет равно константе. Но для того, чтобы гарантировать отсутствие коллизий на втором уровне, требуется, чтобы размер
хеш-таблицы был равен квадрату числа ключей, хешированных в ячейку .Метод №1
Будем использовать
памяти.Теорема: |
Если универсального множества хеш-функций, то вероятность возникновения коллизий не превышает . ключей сохраняются в хеш-таблице размером c использованием хеш-функции , случайно выбранный из |
Доказательство: |
Всего имеется универсального семейства хеш-функций , то для каждой пары вероятность возникновения коллизии равна . Пусть — случайная величина, которая подсчитывает количество коллизий. Если , то математическое ожидание числа коллизий равно пар ключей, которые могут вызвать коллизию. Если хеш-функция выбрана случайным образом из |
Это является очень хорошим результатом, если хотя бы вспомнить на примере парадокса дней рождения о том, что вероятность коллизий растет крайне быстро по сравнению с размером хеш-таблицы.
Метод №2
Будем использовать
памяти.Теорема: |
Если мы сохраняем ключей в хеш-таблице в хеш-таблице размеров c использованием хеш-функции , выбираемой случайным образом из универсального множества хеш-функций, то , где — количество ключей, хешированных в ячейку . |
Доказательство: |
Первый переход в равенстве мы совершили благодаря формуле математического ожидания, в частности - линейности. . Далее мы воспользовались свойствамиОчевидно, что - просто общее количество коллизий, поэтому по свойству универсального хеширования математическое ожидание значения этой суммы не превышает А так как , то , ч.т.д. |
См. также
Ссылки
- Т. Кормен. «Алгоритмы. Построение и анализ» второе издание, Глава 11.5, стр. 308
- Д.Э. Кнут. «Искусство программирования: Сортировка и поиск" Том 3, Глава 6.4, стр. 563
- Perfect hash function — Wikipedia
- Universal and Perfect Hashing
- Универсальное хэширование. Идеальное хэширование