<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=188.170.83.104&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=188.170.83.104&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/188.170.83.104"/>
		<updated>2026-04-09T04:00:41Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%B4%D0%B5%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%85%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=71643</id>
		<title>Идеальное хеширование</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%B4%D0%B5%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%85%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=71643"/>
				<updated>2019-06-08T11:59:49Z</updated>
		
		<summary type="html">&lt;p&gt;188.170.83.104: /* Теоретическое обоснование */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Идеальная хеш-функция''' (англ. ''perfect hash function'') — [[Хеш-таблица#Хеширование|хеш-функция]], которая без [[Разрешение коллизий|коллизий]] отображает различные элементы из множества объектов на множество ключей за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; времени в худшем случае.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Основная идея ==&lt;br /&gt;
Идеальное хеширование используется в задачах со статическим множеством ключей (т.е. после того, как все ключи сохранены в таблице, их множество никогда не изменяется) для обеспечения хорошей асимптотики даже в худшем случае. При этом мы можем дополнительно хотеть, чтобы размер таблицы зависел от количества ключей линейно.&lt;br /&gt;
&lt;br /&gt;
В таком хешировании для доступа к данным потребуется лишь вычисление хеш-функций (одной или нескольких), что делает данный подход наибыстрейшим для доступа к статическим данным. Данная технология применяется в различных словарях и базах данных, в алгоритмах со статической (известной заранее) информацией.&lt;br /&gt;
&lt;br /&gt;
Будем использовать двухуровневую схему хеширования с универсальным хешированием на каждом уровне.&lt;br /&gt;
=== Первый уровень ===&lt;br /&gt;
Используется тот же принцип, что и в случае хеширования с цепочками: &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; ключей хешируются в &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ячеек с использованием хеш-функции &amp;lt;tex&amp;gt;h(k) = ((a\cdot k+b) \bmod p) \bmod m&amp;lt;/tex&amp;gt;, случайно выбранной из [[Универсальное_семейство_хеш-функций | семейства универсальных хеш-функций]] &amp;lt;tex&amp;gt;H_{p,m}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; — простое число, превышающее &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Второй уровень ===&lt;br /&gt;
На данном уровне вместо создания списка ключей будем использовать вторичную хеш-таблицу &amp;lt;tex&amp;gt;S_j&amp;lt;/tex&amp;gt;, хранящую все ключи, хешированные функцией &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; в ячейку &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, со своей функцией &amp;lt;tex&amp;gt;h_j(k)=((a_j\cdot k + b_j) \bmod p) \bmod m_j&amp;lt;/tex&amp;gt;, выбранной из множества &amp;lt;tex&amp;gt;H_{p,m_j}&amp;lt;/tex&amp;gt;. Путем точного выбора хеш-функции &amp;lt;tex&amp;gt;h_j&amp;lt;/tex&amp;gt; мы можем гарантировать отсутствие коллизий на этом уровне. Для этого требуется, чтобы размер &amp;lt;tex&amp;gt;m_j&amp;lt;/tex&amp;gt; хеш-таблицы &amp;lt;tex&amp;gt;S_j&amp;lt;/tex&amp;gt; был равен квадрату числа &amp;lt;tex&amp;gt;n_j&amp;lt;/tex&amp;gt; ключей, хешированных функцией &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; в ячейку &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Несмотря на квадратичную зависимость, ниже будет показано, что при корректном выборе хеш-функции первого уровня количество требуемой для хеш-таблицы памяти будет &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Теоретическое обоснование ==&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; ключей сохраняются в хеш-таблице размером &amp;lt;tex&amp;gt;m=n^2&amp;lt;/tex&amp;gt; c использованием хеш-функции &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, случайно выбранной из [[Универсальное_семейство_хеш-функций | универсального множества хеш-функций]], то [[Математическое_ожидание_случайной_величины | математическое ожидание]] числа коллизий не превышает  &amp;lt;tex dpi=&amp;quot;180&amp;quot;&amp;gt;{1 \over 2}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Всего имеется &amp;lt;tex&amp;gt;\dbinom{n}{2}&amp;lt;/tex&amp;gt; пар ключей, которые могут вызвать коллизию. Если хеш-функция выбрана случайным образом из [[Универсальное_семейство_хеш-функций | универсального семейства хеш-функций]] &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;, то для каждой пары вероятность возникновения коллизии равна &amp;lt;tex dpi=&amp;quot;180&amp;quot;&amp;gt;{1 \over m}&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; — [[Дискретная_случайная_величина |случайная величина]], которая подсчитывает количество коллизий. Если &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;, то [[Математическое_ожидание_случайной_величины | математическое ожидание]] числа коллизий равно&lt;br /&gt;
&amp;lt;tex&amp;gt;E[X] = &amp;lt;/tex&amp;gt; &amp;lt;tex dpi=&amp;quot;180&amp;quot;&amp;gt; \binom{n}{2} \cdot {1 \over n^2} = {n^2-n \over 2} \cdot {1 \over n^2} &amp;lt; {1 \over 2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Это является очень хорошим результатом, если хотя бы вспомнить на примере [[Хеш-таблица#Введение | парадокса дней рождения]] о том, что вероятность коллизий растет крайне быстро по сравнению с размером хеш-таблицы.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если мы сохраняем &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; ключей в хеш-таблице размеров &amp;lt;tex&amp;gt;m=n&amp;lt;/tex&amp;gt; c использованием хеш-функции &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, выбираемой случайным образом из универсального множества хеш-функций, то &amp;lt;tex&amp;gt;E\left[\displaystyle \sum_{j=0}^{m-1} n_j^2 \right] &amp;lt; 2n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n_j&amp;lt;/tex&amp;gt; — количество ключей, хешированных в ячейку &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;E\left[\displaystyle \sum_{j=0}^{m-1} n_j^2 \right] =&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; E\left[ \displaystyle \sum_{j=0}^{m-1} (n_j + 2 \dbinom{n_j}{2})\right] = &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; E\left[ \displaystyle \sum_{j=0}^{m-1} n_j\right] + 2E\left[\displaystyle \sum_{j=0}^{m-1} \dbinom{n_j}{2}\right] = &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; 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]&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первый переход в равенстве мы совершили благодаря формуле &amp;lt;tex&amp;gt;a^2 = a + 2\cdot\dbinom{a}{2}&amp;lt;/tex&amp;gt;. Далее мы воспользовались свойствами [[Математическое_ожидание_случайной_величины | математического ожидания]], в частности - линейности.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt;\displaystyle \sum_{j=0}^{m-1} \dbinom{n_j}{2}&amp;lt;/tex&amp;gt; - просто общее количество коллизий, поэтому по свойству универсального хеширования математическое ожидание значения этой суммы не превышает&lt;br /&gt;
&amp;lt;tex dpi=&amp;quot;180&amp;quot;&amp;gt;\binom{n}{2}{1 \over m} = {n(n-1) \over 2m} = {n-1 \over 2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
А так как &amp;lt;tex&amp;gt;m = n&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
&amp;lt;tex&amp;gt;E\left[\displaystyle \sum_{j=0}^{m-1} n_j^2 \right] \leqslant &amp;lt;/tex&amp;gt; &amp;lt;tex dpi=&amp;quot;150&amp;quot;&amp;gt; n + 2 \cdot {n-1 \over 2} = 2n - 1 &amp;lt; 2n&amp;lt;/tex&amp;gt;, ч.т.д.&lt;br /&gt;
}}&lt;br /&gt;
Теперь выведем 2 следствия из этой теоремы.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если мы сохраняем &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; ключей в хеш-таблице размером &amp;lt;tex&amp;gt;m=n&amp;lt;/tex&amp;gt; с использованием хеш-функции &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, выбираемой случайным образом из [[Универсальное_семейство_хеш-функций | универсального множества хеш-функций]], и устанавливаем размер каждой вторичной хеш-таблицы равным &amp;lt;tex&amp;gt;m_j=n_j^2&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(j=0,1,...,m-1)&amp;lt;/tex&amp;gt;, то математическое ожидание количества необходимой для вторичных хеш-таблиц в схеме идеального хеширования памяти не превышает &amp;lt;tex&amp;gt;2n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Поскольку &amp;lt;tex&amp;gt;m_j=n_j^2&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;j=0,1,...,m-1&amp;lt;/tex&amp;gt;, согласно предыдущей теореме:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E\left[\displaystyle \sum_{j=0}^{m-1} m_j \right] = E\left[\displaystyle \sum_{j=0}^{m-1} n_j^2 \right] &amp;lt; 2n&amp;lt;/tex&amp;gt;, ч.т.д.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если мы сохраняем &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; ключей в хеш-таблице размером &amp;lt;tex&amp;gt;m=n&amp;lt;/tex&amp;gt; с использованием хеш-функции &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, выбираемой случайным образом из [[Универсальное_семейство_хеш-функций | универсального множества хеш-функций]], и устанавливаем размер каждой вторичной хеш-таблицы равным &amp;lt;tex&amp;gt;m_j=n_j^2&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(j=0,1,...,m-1)&amp;lt;/tex&amp;gt;, то вероятность того, что общее количество необходимой для вторичных хеш-таблиц памяти не менее &amp;lt;tex&amp;gt;4n&amp;lt;/tex&amp;gt;, меньше чем &amp;lt;tex dpi=&amp;quot;180&amp;quot;&amp;gt;{1 \over 2}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Применим [[Неравенство Маркова| неравенство Маркова]] &amp;lt;tex&amp;gt;P(X \geqslant t) \leqslant E[X]/t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;X=\displaystyle \sum_{j=0}^{m-1} m_j&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t=4n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;P \left \{\displaystyle \sum_{j=0}^{m-1} m_j \geqslant 4n \right \} \leqslant E\left[\displaystyle\sum_{j=0}^{m-1} mj\right]&amp;lt;/tex&amp;gt; &amp;lt;tex dpi=&amp;quot;150&amp;quot;&amp;gt; {1 \over 4n} &amp;lt; &amp;lt;/tex&amp;gt; &amp;lt;tex dpi=&amp;quot;150&amp;quot;&amp;gt;{2n \over 4n} = {1 \over 2}&amp;lt;/tex&amp;gt;, ч.т.д.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
* [[Хеширование]]&lt;br /&gt;
* [[Хеширование_кукушки|Хеширование кукушки]]&lt;br /&gt;
* [[Разрешение коллизий]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* Т. Кормен. «Алгоритмы. Построение и анализ» второе издание, Глава 11.5, стр. 308&lt;br /&gt;
* Д.Э. Кнут. «Искусство программирования: Сортировка и поиск&amp;quot; Том 3, Глава 6.4, стр. 563&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Perfect_hash_function Wikipedia — Perfect hash function]&lt;br /&gt;
* [http://www.cs.cmu.edu/afs/cs/academic/class/15451-s07/www/lecture_notes/lect0215.pdf Universal and Perfect Hashing]&lt;br /&gt;
* [http://nord.org.ua/static/course/algo_2009/lecture8.pdf Универсальное хэширование. Идеальное хэширование]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]] &lt;br /&gt;
[[Категория:Хеширование]]&lt;/div&gt;</summary>
		<author><name>188.170.83.104</name></author>	</entry>

	</feed>