<?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=176.59.15.166&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=176.59.15.166&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/176.59.15.166"/>
		<updated>2026-05-06T18:50:52Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A5%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0&amp;diff=64085</id>
		<title>Хеш-таблица</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A5%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0&amp;diff=64085"/>
				<updated>2018-03-10T11:29:50Z</updated>
		
		<summary type="html">&lt;p&gt;176.59.15.166: Отмена правки 64065, сделанной 93.85.153.53 (обсуждение)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition='''Хеш-табли́ца''' (англ. ''hash-table'') {{---}} структура данных, реализующая интерфейс ассоциативного массива. В отличие от [[Дерево_поиска,_наивная_реализация|деревьев поиска]], реализующих тот же интерфейс, обеспечивают меньшее время отклика в среднем. Представляет собой эффективную структуру данных для реализации словарей, а именно, она позволяет хранить пары (ключ, значение) и выполнять три операции: операцию добавления новой пары, операцию поиска и операцию удаления пары по ключу.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
Существует два основных вида хеш-таблиц: [[Разрешение_коллизий#Разрешение коллизий с помощью цепочек|''с цепочками'']] и [[Разрешение_коллизий#Линейное разрешение коллизий|''открытой адресацией'']]. Хеш-таблица содержит некоторый массив &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;, элементы которого есть пары (хеш-таблица с открытой адресацией) или списки пар (хеш-таблица с цепочками).&lt;br /&gt;
&lt;br /&gt;
Выполнение операции в хеш-таблице начинается с вычисления хеш-функции от ключа. Хеш-код &amp;lt;tex&amp;gt;i = h(key)&amp;lt;/tex&amp;gt; играет роль индекса в массиве &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;, а зная индекс, мы можем выполнить требующуюся операцию (добавление, удаление или поиск).&lt;br /&gt;
&lt;br /&gt;
Количество коллизий зависит от хеш-функции; чем лучше используемая хеш-функция, тем меньше вероятность их возникновения. &lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Вероятность коллизий при вставке в хеш-таблицу превышает 50%&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Пусть хеш-таблица имеет размер &amp;lt;tex&amp;gt;len&amp;lt;/tex&amp;gt; и в нее добавляют &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. Рассмотрим &amp;lt;tex&amp;gt;{p}'(n)&amp;lt;/tex&amp;gt; — вероятность того, что не возникнет ни одной коллизии. Добавим два любых элемента в нашу хеш-таблицу. Вероятность того, что они не попадут в одну и ту же ячейку таблицы равна &amp;lt;tex&amp;gt;1 - \dfrac{1}{len}&amp;lt;/tex&amp;gt;. Возьмем еще один элемент. Тогда вероятность того, что третий элемент не попадет в одну из уже занятых ячеек равна &amp;lt;tex&amp;gt;1 - \dfrac{2}{len}&amp;lt;/tex&amp;gt;. Рассуждая аналогичным образом, получим формулу:&lt;br /&gt;
&amp;lt;tex&amp;gt;{p}'(n) = \left( 1 - \dfrac{1}{len}\right )\cdot \left( 1 - \dfrac{2}{len}\right )\dots\left( 1 - \dfrac{n - 1}{len}\right ) = \dfrac{len \cdot \left(len - 1 \right )\dots\left (len - n + 1 \right )}{len^{n}} = \dfrac{len!}{len^{n} \cdot  \left (len - n \right)!}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;{p}(n)&amp;lt;/tex&amp;gt; — вероятность возникновения коллизии равна:&lt;br /&gt;
&amp;lt;tex&amp;gt;p(n) = 1 - {p}'(n)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
что в общем случае &amp;lt;tex&amp;gt; &amp;gt; \dfrac{1}{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Способ разрешения коллизий — важная составляющая любой хеш-таблицы.&lt;br /&gt;
&lt;br /&gt;
Полностью избежать коллизий для произвольных данных невозможно в принципе, и хорошая хеш-функция в состоянии только минимизировать их количество. Но, в некоторых специальных случаях их удаётся избежать. Если все ключи элементов известны заранее, либо меняются очень редко, то можно подобрать хеш-функцию, с помощью которой, все ключи будут распределены по хеш-таблице без коллизий. Это хеш-таблицы с ''прямой адресацией''; в них все операции, такие как: поиск, вставка и удаление работают за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если мы поделим число хранимых элементов на размер массива &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; (число возможных значений хеш-функции), то узнаем коэффициент заполнения хеш-таблицы (англ. ''load factor''). От этого параметра зависит среднее время выполнения операций.&lt;br /&gt;
&lt;br /&gt;
=== Хеширование ===&lt;br /&gt;
'''Хеширование''' (англ. ''hashing'') {{---}} класс методов поиска, идея которого состоит в вычислении хеш-кода, однозначно определяемого элементом с помощью хеш-функции, и использовании его, как основы для поиска (индексирование в памяти по хеш-коду выполняется за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;). В общем случае, однозначного соответствия между исходными данными и хеш-кодом нет в силу того, что количество значений хеш-функций меньше, чем вариантов исходных данных, поэтому существуют элементы, имеющие одинаковые хеш-коды — так называемые коллизии, но если два элемента имеют разный хеш-код, то они гарантированно &lt;br /&gt;
различаются. Вероятность возникновения коллизий играет немаловажную роль в оценке качества хеш-функций. Для того чтобы коллизии не замедляли работу с таблицой существуют [[Разрешение коллизий|методы для борьбы с ними]].&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1&lt;br /&gt;
|definition=&amp;lt;tex&amp;gt;U &amp;lt;/tex&amp;gt; {{---}} множество объектов (универсум).&amp;lt;br&amp;gt; &amp;lt;tex&amp;gt;h : U \rightarrow S = \mathcal {f} 0 \dots m - 1 \mathcal {g}&amp;lt;/tex&amp;gt; {{---}} называется хеш-функцией, где множество &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; хранит ключи из множества &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt; Если &amp;lt;tex&amp;gt;x \in U&amp;lt;/tex&amp;gt; значит &amp;lt;tex&amp;gt;h(x) \in S&amp;lt;/tex&amp;gt; &amp;lt;br&amp;gt; '''Коллизия''' (англ. ''collision''): &amp;lt;tex&amp;gt;\exists x \neq y : h(x) = h(y)&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;
Случайная хеш-функция.&lt;br /&gt;
&lt;br /&gt;
=== Свойства хеш-таблицы ===&lt;br /&gt;
&lt;br /&gt;
На поиск элемента в хеш-таблице в худшем случае, может потребоваться столько же времени, как и в списке, а именно &amp;lt;tex&amp;gt;\Theta(n)&amp;lt;/tex&amp;gt;, но на практике хеширование более эффективно. При некоторых разумных допущениях [[Математическое_ожидание_случайной_величины|математическое ожидание]] времени поиска элемента в хеш-таблице составляет &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. А все операции (поиск, вставка и удаление элементов) в среднем выполняются за время &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
При этом не гарантируется, что время выполнения отдельной операции мало́, так как при достижении некоторого значения коэффициента заполнения необходимо [[Перехеширование. Амортизационный анализ|перехешировать]] таблицу: увеличить размер массива &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; и заново добавить в новую хеш-таблицу все пары.&lt;br /&gt;
&lt;br /&gt;
===Хеширование в современных языках программирования===&lt;br /&gt;
&lt;br /&gt;
Почти во всех современных языках присутствуют классы, реализующие хеширование. Рассмотрим некоторые из них.&lt;br /&gt;
*Java&lt;br /&gt;
**HashMap  &amp;lt;ref&amp;gt;[http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html HashMap {{---}} Java Platform SE 7]&amp;lt;/ref&amp;gt; {{---}} реализация интерфейса ассоциативного массива с использованием хеш-таблицы,&lt;br /&gt;
**HashSet &amp;lt;ref&amp;gt;[http://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html HashSet {{---}} Java Platform SE 7]&amp;lt;/ref&amp;gt;  {{---}} реализация интерфейса множества с использованием хеш-таблицы,&lt;br /&gt;
**LinkedHashMap &amp;lt;ref&amp;gt;[http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html LinkedHashMap {{---}} Java Platform SE 7]&amp;lt;/ref&amp;gt; {{---}} потомок класса HashMap. Позволяет просматривать значения в том порядке, в котором они были добавлены.&lt;br /&gt;
*C++&lt;br /&gt;
**unordered_map &amp;lt;ref&amp;gt;[http://www.cplusplus.com/reference/unordered_map/unordered_map/ unordered_map {{---}} cplusplus.com]&amp;lt;/ref&amp;gt; {{---}} реализация интерфейса ассоциативного массива с использованием хеш-таблицы,&lt;br /&gt;
**unordered_set  &amp;lt;ref&amp;gt;[http://www.cplusplus.com/reference/unordered_map/unordered_set/ unordered_set {{---}} cplusplus.com]&amp;lt;/ref&amp;gt;  {{---}} реализация интерфейса множества с использованием хеш-таблицы.&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации==&lt;br /&gt;
* Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. «Алгоритмы. Построение и анализ» {{---}} «Вильямс», 2011 г. {{---}} 1296 стр. {{---}} ISBN 978-5-8459-0857-5, 5-8459-0857-4, 0-07-013151-1&lt;br /&gt;
* Дональд Кнут. «Искусство программирования, том 3. Сортировка и поиск» {{---}} «Вильямс», 2007 г. {{---}} 824 стр. {{---}} ISBN 0-201-89685-0&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Хеш-таблица Википедия {{---}} Хеш-таблица]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Хеширование]]&lt;br /&gt;
[[Категория:Структуры данных]]&lt;/div&gt;</summary>
		<author><name>176.59.15.166</name></author>	</entry>

	</feed>