140 lines
11 KiB
HTML
140 lines
11 KiB
HTML
|
|
<!DOCTYPE html>
|
||
|
|
<html lang="en">
|
||
|
|
<head>
|
||
|
|
<meta charset="UTF-8" />
|
||
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
|
|
<title>Страница 8</title>
|
||
|
|
</head>
|
||
|
|
<body>
|
||
|
|
<p style="text-align: center">
|
||
|
|
<i><b>Страница 8</b></i>
|
||
|
|
</p>
|
||
|
|
<hr />
|
||
|
|
<h1 style="text-align: center">Анализ хеш-таблиц и алгоритмов поиска</h1>
|
||
|
|
<h2 style="text-align: center">Общее описание [2, c. 285-318]</h2>
|
||
|
|
<p style="text-align: justify">
|
||
|
|
Хеш-таблица представляет собой эффективную структуру данных для реализации
|
||
|
|
словарей. Хотя на поиск элемента в хеш-таблице может в наихудшем случае
|
||
|
|
потребоваться столько же времени, сколько на поиск в связанном списке, а
|
||
|
|
именно - <i>Θ(n)</i>, на практике хеширование исключительно
|
||
|
|
эффективно. При вполне обоснованных допущениях среднее время поиска
|
||
|
|
элемента в хеш-таблице составляет <i>O(1)</i>.
|
||
|
|
</p>
|
||
|
|
<h2 style="text-align: center">
|
||
|
|
Таблица с прямой адресацией, как хеш-таблица
|
||
|
|
</h2>
|
||
|
|
<p style="text-align: justify">
|
||
|
|
Хеш-таблица обобщает обычный массив. Возможность прямой индексации
|
||
|
|
элементов обычного массива обеспечивает доступ к произвольной позиции в
|
||
|
|
массиве за время <i>O(1)</i>. Хеширование представляет собой исключительно
|
||
|
|
эффективную и практичную технологию: в среднем все базовые словарные
|
||
|
|
операции выполняются за время <i>O(1)</i><i>.</i>
|
||
|
|
</p>
|
||
|
|
<p style="text-align: justify">
|
||
|
|
Недостаток прямой адресации очевиден: если совокупность ключей
|
||
|
|
<i>U</i> велика, хранение таблицы <i>T</i> размером
|
||
|
|
<i>|U|</i> непрактично, а то и вовсе невозможно - в зависимости от
|
||
|
|
количества доступной памяти и размера совокупности ключей. Кроме того,
|
||
|
|
множество <i>K</i> реально сохранённых ключей может быть мало по сравнению
|
||
|
|
с совокупностью ключей <i>U</i>, а в этом случае память, выделенная для
|
||
|
|
таблицы <i>T</i>, в основном расходуется напрасно.
|
||
|
|
</p>
|
||
|
|
<p style="text-align: justify">
|
||
|
|
Когда множество <i>K</i> хранящихся в словаре ключей гораздо меньше
|
||
|
|
совокупности возможных ключей <i>U</i>, для хеш-таблицы требуется
|
||
|
|
существенно меньше места, чем для таблицы с прямой адресацией<sup>1</sup>.
|
||
|
|
Точнее говоря, требования к памяти могут быть снижены
|
||
|
|
до <i>Θ(/K/)</i>, при этом время поиска элемента в хеш-таблице
|
||
|
|
останется равным <i>O(1)</i>. Нужно только заметить, что это граница
|
||
|
|
времени поиска в среднем случае, в то время как в случае таблицы с прямой
|
||
|
|
адресацией эта граница справедлива для наихудшего случая.
|
||
|
|
</p>
|
||
|
|
<h2 style="text-align: center">Хеш-таблица с прямым связыванием</h2>
|
||
|
|
<p>
|
||
|
|
Время, необходимое для вставки в наихудшем случае, равно <i>O(1)</i>.
|
||
|
|
Процедура вставки выполняется очень быстро, в частности, потому, что
|
||
|
|
предполагается, что вставляемый элемент отсутствует в таблице. Время
|
||
|
|
работы поиска в наихудшем случае пропорционально длине списка. Удаление
|
||
|
|
элемента может быть выполнено за время <i>O(1)</i> при использовании
|
||
|
|
дважды связанных списков.
|
||
|
|
</p>
|
||
|
|
<p>
|
||
|
|
Пусть у нас есть хеш-таблица T с m ячейками, в которых хранятся n
|
||
|
|
элементов. В наихудшем случае хеширование с цепочками ведёт себя крайне
|
||
|
|
неприятно: все n ключей хешированы в одну и ту же ячейку, создав список
|
||
|
|
длиной n. Таким образом, время поиска в наихудшем случае равно <i
|
||
|
|
style="text-align: justify"
|
||
|
|
>Θ(n)</i
|
||
|
|
>
|
||
|
|
плюс время вычисления хеш-функции, что ничуть не лучше, чем в случае
|
||
|
|
использования связного списка для хранения всех n элементов. Понятно, что
|
||
|
|
использование хеш-таблиц в наихудшем случае совершенно бессмысленно.
|
||
|
|
</p>
|
||
|
|
<h3>Теорема 8.1<sup>2</sup></h3>
|
||
|
|
<p>
|
||
|
|
В хеш-таблице с разрешением коллизий методом цепочек время неудачного
|
||
|
|
поиска в среднем случае в предположении простого равномерного хеширования
|
||
|
|
составляет <i style="text-align: justify">Θ(1 + a).</i>
|
||
|
|
</p>
|
||
|
|
<h3>Теорема 8.2</h3>
|
||
|
|
<p>
|
||
|
|
В хеш-таблице с разрешением коллизий методом цепочек время успешного
|
||
|
|
поиска в среднем случае в предположении простого равномерного хеширования
|
||
|
|
в среднем равно <i style="text-align: justify">Θ(1 + a).</i>
|
||
|
|
</p>
|
||
|
|
<p style="text-align: justify">
|
||
|
|
Если количество ячеек в хеш-таблице как минимум пропорционально количеству
|
||
|
|
элементов, хранящихся в ней, то <i>n = O(m)</i> и, следовательно,
|
||
|
|
коэффициент заполнения равен <i>n/m = O(m)/m = O(1).</i> Таким
|
||
|
|
образом, поиск элемента в хеш-таблице в среднем требует постоянного
|
||
|
|
времени. Поскольку в худшем случае вставка элемента в хеш-таблицу занимает
|
||
|
|
O(1) времени (как и удаление элемента при использовании дважды связанных
|
||
|
|
списков), можно сделать вывод, что все словарные операции в хеш-таблице в
|
||
|
|
среднем выполняются за время O(1).
|
||
|
|
</p>
|
||
|
|
<h2 style="text-align: center">Хеш-таблица с открытой адресацией</h2>
|
||
|
|
<p style="text-align: justify">
|
||
|
|
Мы проанализируем математическое ожидание количества исследований для
|
||
|
|
хеширования с открытой адресацией в предположении равномерного хеширования
|
||
|
|
и начнём с анализа количества исследований в случае неудачного поиска.
|
||
|
|
</p>
|
||
|
|
<h3>Теорема 8.3</h3>
|
||
|
|
<p>
|
||
|
|
Математическое ожидание количества исследований при неудачном поиске в хеш
|
||
|
|
таблице с открытой адресацией и коэффициентом заполнения
|
||
|
|
<i>a = n/m < 1</i> в предположении равномерного хеширования не
|
||
|
|
превышает <i>1/(1-a).</i>
|
||
|
|
</p>
|
||
|
|
<h3>Следствие 8.1</h3>
|
||
|
|
<p>
|
||
|
|
Вставка элемента в хеш-таблицу с открытой адресацией и коэффициентом
|
||
|
|
заполнения a в предположении равномерного хеширования требует в среднем не
|
||
|
|
более <i>1/(1-a)</i> исследований.
|
||
|
|
</p>
|
||
|
|
<h3>Теорема 8.4</h3>
|
||
|
|
<p>
|
||
|
|
Математическое ожидание количества исследований при удачном поиске в
|
||
|
|
хеш-таблице с открытой адресацией и коэффициентом заполнения <i>a < 1</i>, в
|
||
|
|
предположении равномерного хеширования и равновероятного поиска любого из
|
||
|
|
ключей не превышает
|
||
|
|
</p>
|
||
|
|
<div style="text-align: center">
|
||
|
|
<img src="8.1.png" width="150" />
|
||
|
|
</div>
|
||
|
|
<p> </p>
|
||
|
|
<hr />
|
||
|
|
<p>
|
||
|
|
<sup>1</sup>В данном контексте автор, упоминая таблицу с прямой
|
||
|
|
адресацией, не применяет термин хеш, так как, предположительно, в примере
|
||
|
|
оригинальной книги не используется хеш-функция для операций поиска
|
||
|
|
элемента или все операции вставки элемента являются инъективными и не
|
||
|
|
нуждаются в решении проблем коллизий.
|
||
|
|
</p>
|
||
|
|
<p>
|
||
|
|
<sup>2</sup>Все доказательства теорем представлены в книге автора с целью
|
||
|
|
описания минимума методического материала
|
||
|
|
</p>
|
||
|
|
</body>
|
||
|
|
</html>
|