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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Источники)
(При открытом хешировании)
Строка 4: Строка 4:
 
При использовании [[Открытое и закрытое хеширование#Открытое хеширование|открытого хеширования]] , элементы с одинаковым результатом хеш-функции помещают в список. Так как операции <tex>Add(x)</tex>, <tex>Exists(x)</tex> и <tex>Delete(x)</tex> работают за <tex>O(l)</tex>, где <tex>l</tex> - длина списка, то с некоторого момента выгодно увеличить размер хеш-таблицы, чтобы поддерживать амортизационную стоимость операции <tex>O(1)</tex>.
 
При использовании [[Открытое и закрытое хеширование#Открытое хеширование|открытого хеширования]] , элементы с одинаковым результатом хеш-функции помещают в список. Так как операции <tex>Add(x)</tex>, <tex>Exists(x)</tex> и <tex>Delete(x)</tex> работают за <tex>O(l)</tex>, где <tex>l</tex> - длина списка, то с некоторого момента выгодно увеличить размер хеш-таблицы, чтобы поддерживать амортизационную стоимость операции <tex>O(1)</tex>.
  
Рассмотрим следующий алгоритм перехеширования: когда в хеш-таблицу добавлено <tex>\frac{4n}{3}</tex> элементов, где <tex>n</tex> - размер хеш-таблицы, создадим новую хеш-таблицу размера <tex>2n</tex>, и последовательно переместим в нее все элементы первой таблицы. При этом, сменим хеш-функцию так, чтобы она выдавала значения <tex>[0..2n-1]</tex> (в функциях, использующих остаток от деления на длину таблицы, достаточно брать остаток от деления на <tex>2n</tex> вместо остатка от деления на <tex>n</tex>).  
+
Рассмотрим следующий алгоритм перехеширования: когда в хеш-таблицу добавлено <tex dpi = "180">\frac{4n}{3}</tex> элементов, где <tex>n</tex> - размер хеш-таблицы, создадим новую хеш-таблицу размера <tex>2n</tex>, и последовательно переместим в нее все элементы первой таблицы. При этом, сменим хеш-функцию так, чтобы она выдавала значения <tex>[0..2n-1]</tex> (в функциях, использующих остаток от деления на длину таблицы, достаточно брать остаток от деления на <tex>2n</tex> вместо остатка от деления на <tex>n</tex>).  
  
 
Найдем амортизационную стоимость добавления, после которого было сделано перехеширование, используя метод предоплаты. С момента последнего перехеширования было произведено не менее <tex>\frac{2n}{3}</tex> операций <tex>Add(x)</tex>, так как изначально в массиве находится <tex>\frac{2n}{3}</tex> элементов (или <tex>0</tex> в начале работы), а перехеширование происходит при наличии <tex>\frac{4n}{3}</tex> элементов.  
 
Найдем амортизационную стоимость добавления, после которого было сделано перехеширование, используя метод предоплаты. С момента последнего перехеширования было произведено не менее <tex>\frac{2n}{3}</tex> операций <tex>Add(x)</tex>, так как изначально в массиве находится <tex>\frac{2n}{3}</tex> элементов (или <tex>0</tex> в начале работы), а перехеширование происходит при наличии <tex>\frac{4n}{3}</tex> элементов.  

Версия 18:31, 5 мая 2012

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

Перехеширование при разных типах хеширования

При открытом хешировании

При использовании открытого хеширования , элементы с одинаковым результатом хеш-функции помещают в список. Так как операции [math]Add(x)[/math], [math]Exists(x)[/math] и [math]Delete(x)[/math] работают за [math]O(l)[/math], где [math]l[/math] - длина списка, то с некоторого момента выгодно увеличить размер хеш-таблицы, чтобы поддерживать амортизационную стоимость операции [math]O(1)[/math].

Рассмотрим следующий алгоритм перехеширования: когда в хеш-таблицу добавлено [math]\frac{4n}{3}[/math] элементов, где [math]n[/math] - размер хеш-таблицы, создадим новую хеш-таблицу размера [math]2n[/math], и последовательно переместим в нее все элементы первой таблицы. При этом, сменим хеш-функцию так, чтобы она выдавала значения [math][0..2n-1][/math] (в функциях, использующих остаток от деления на длину таблицы, достаточно брать остаток от деления на [math]2n[/math] вместо остатка от деления на [math]n[/math]).

Найдем амортизационную стоимость добавления, после которого было сделано перехеширование, используя метод предоплаты. С момента последнего перехеширования было произведено не менее [math]\frac{2n}{3}[/math] операций [math]Add(x)[/math], так как изначально в массиве находится [math]\frac{2n}{3}[/math] элементов (или [math]0[/math] в начале работы), а перехеширование происходит при наличии [math]\frac{4n}{3}[/math] элементов.

Для проведения перехеширования необходимо произвести [math]\frac{4n}{3}[/math] операций [math]Add(x)[/math], средняя стоимость которых составляет [math]O(1)[/math] (Анализ открытого хеширования, см. Т.Корман, второе издание, стр. 288), потратить [math]\frac{4n}{3}[/math] операций на проход хеш-таблицы, и [math]\frac{4n}{3}[/math] операций на удаление предыдущей таблицы. В итоге, если мы увеличим стоимость каждой операции [math]Add(x)[/math] на [math]6[/math], то есть на [math]O(1)[/math], операция перехеширования будет полностью предоплачена. Значит, амортизационная стоимость перехеширования при открытом типе хеш-таблицы равна [math]O(1)[/math].

При закрытом хешировании

При использовании хеширования с открытой адресацией, или закрытого хеширования , операции [math]Add(x)[/math], [math]Exists(x)[/math] и [math]Delete(x)[/math] в худшем случае работают за [math]O(k)[/math], где [math]k[/math] - количество уже добавленных в таблицу элементов, поэтому перехеширование надо проводить при неполном заполнении хеш-таблицы.

Будем проводить перехеширование при заполнении таблицы на [math]\frac{n}{2}[/math], увеличивая размер таблицы в [math]2[/math] раза. Аналогично случаю с открытым хешированием, для перехеширования необходимо будет потратить [math]O(n)[/math] операций на обход таблицы, [math]O(n)\cdot A[/math] элементарных операций на добавление элементов, где [math]A[/math] - стоимость операции [math]Add(x)[/math], и [math]O(n)[/math] операций на удаление таблицы. Так как [math]A \geq 1[/math], и между последовательными перехешированиями производится [math]O(n)[/math] добавлений, то можно предоплатить перехеширование, увеличив стоимость операции [math]Add(x)[/math] на [math]O(1)[/math], и не изменив стоимость остальных операций.

См. также

Источники

  • Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — 1296 с.: ил. — Парал. тит. англ. — ISBN 978-5-8459-0857-5 (рус.)