Разрешение коллизий — различия между версиями
(Промежуточное) |
(Вроде всё) |
||
Строка 21: | Строка 21: | ||
== Проверка наличия элемента в таблице== | == Проверка наличия элемента в таблице== | ||
+ | |||
+ | Проверка осуществляется аналогично добавлению: мы проверяем ячейку <tex>i</tex> и другие, в соответствии с выбранной стратегией, пока не найдём искомый элемент или свободную ячейку. | ||
+ | |||
+ | == Проблемы закрытого хеширования == | ||
+ | |||
+ | Проблем две - крайне нетривиальное удаление элемента из таблицы и образование кластеров. | ||
+ | Кластер - последовательность занятых клеток. Их наличие замедляет все операции с хеш-таблицей: при добавлении требуется перебирать всё больше элементов, при проверке тоже. Чем больше в таблице элементов, тем больше в ней кластеры и тем выше вероятность того, что добавляемый элемент попадёт в кластер. | ||
+ | |||
+ | Ещё при поиске элемента может получится так, что мы дойдём до конца таблицы. Обычно поиск продолжается, начиная с другого конца. Однако, если мы придём в ту ячейку, откуда начинался поиск, то добавить элемент в текущую таблицу будет невозможно и необходимо провести операцию перехеширования. |
Версия 00:13, 16 мая 2011
Поиск свободного места при закрытом хешировании - задача, возникающая при создании хеш-таблицы, использующей так называемое зарытое хеширование.
При использовании открытого хеширования такой проблемы не возникает, так как там в каждой ячейке хранится список всех элементов. При добавлении необходимо просто дописать элемент в конец списка.
Закрытое хеширование работает иначе: в каждой ячейке хеш-таблицы хранится только один элемент. Тогда при добавлении, если ячейка свободна, мы просто записываем добавляемый элемент в эту ячейку. Однако если эта ячейка занята - необходимо поместить добавляемый элемент в какую-нибудь другую свободную ячейку. Такие ситуации нередки, так как невозможно использовать хеш-функцию, не дающую коллизий, а каждой ячейке таблицы соответствует одно значение хеш-функции. Далее мы рассмотрим несколько стратегий поиска свободного места в данном случае.
Стратегии поиска
Последовательный поиск
При попытке добавить элемент в занятую ячейку
начинаем последовательно просматривать ячейки и так далее, пока не найдём свободную ячейку. В неё и запишем элемент.Линейный поиск
Выбираем шаг
. При попытке добавить элемент в занятую ячейку начинаем последовательно просматривать ячейки и так далее, пока не найдём свободную ячейку. В неё и запишем элемент. По сути Последовательный поиск - частный случай линейного, где .Квадратичный поиск
Шаг
не фиксирован, а изменяется квадратично. В качестве начального значения часто выбирается . При попытке добавить элемент в занятую ячейку начинаем последовательно просматривать ячейки и так далее, пока не найдём свободную ячейку.Проверка наличия элемента в таблице
Проверка осуществляется аналогично добавлению: мы проверяем ячейку
и другие, в соответствии с выбранной стратегией, пока не найдём искомый элемент или свободную ячейку.Проблемы закрытого хеширования
Проблем две - крайне нетривиальное удаление элемента из таблицы и образование кластеров. Кластер - последовательность занятых клеток. Их наличие замедляет все операции с хеш-таблицей: при добавлении требуется перебирать всё больше элементов, при проверке тоже. Чем больше в таблице элементов, тем больше в ней кластеры и тем выше вероятность того, что добавляемый элемент попадёт в кластер.
Ещё при поиске элемента может получится так, что мы дойдём до конца таблицы. Обычно поиск продолжается, начиная с другого конца. Однако, если мы придём в ту ячейку, откуда начинался поиск, то добавить элемент в текущую таблицу будет невозможно и необходимо провести операцию перехеширования.