Метод линейного опробования (открытое хэширование)



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

Метод реализует следующую последовательность действий: на первом шаге все ячейки хэш-таблицы помечаются как свободные. При добавлении нового ключа проверяется, занята ли данная ячейка. Если ячейка занята, то алгоритм осуществляет просмотр в области адреса пока не найдется свободное место.

При поиске элемента в таблице, результатами пробы могут быть следующие ситуации:

· позиция таблицы содержит элемент, который совпадает с искомым – поиск завершен успешно;

· позиция таблицы содержит элемент, который не совпадает с искомым – поиск продолжается, проверяется ячейка с следующим индексом (при достижении конца таблицы реализуется переход к ее началу), поиск продолжается до тех пор, пока не будет найден искомый ключ, не будет обнаружена пустая ячейка или не будет достигнута начальная ячейка поиска (при полностью заполненной таблице).

· позиция таблицы не содержит элемент (пустая) – поиск завершен, искомый элемент отсутствует в таблице.

На рисунке 5.14 представлен пример добавления ключа k4 с рассчитанным индексом i = 0 в хэш-таблицу. Поскольку ячейка уже занята, реализуется просмотр ячейки с индексами i = 1 (тоже занята) и i = 2 (свободна). Так как ячейка с индексом i = 2 свободна, в нее помещается искомый элемент. Теперь, при поиске ключа k4 в хэш-таблице будет проделана та же работа: рассчитан индекс i = 0, в которой отсутствует искомый элемент, проверены ячейки i = 1 (поиск продолжается) и i = 2 (элемент найден).

Рис. 5.15. Пример добавления и поиска элемента в хэш-таблице методом линейного опробывания

 

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

К достоинствам метода линейного опробования можно отнести простоту его реализации, в сравнении с методом цепочек.

 

Метод повторного хэширования

Метод подразумевает наличие на одной хэш-функции, а некоторого набора таких функций:

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

Очевидно, что все методы открытого хэширования могут столкнуться с проблемой, когда таблица будет полностью заполнена. Такие ситуации требуют расширения таблицы и ее полного перестроения. Эта процедура занимает много времени. Также перестроение хэш-таблицы рекомендуется выполнять, если ее заполненность достигает 60% - после этого поиск и добавление новых элементов в таблицу будет занимать значительное время. Именно поэтому на начальном этапе создания хэш-таблицы важно оценить количество элементов, которые в нее планируется занести.

 


Дата добавления: 2020-01-07; просмотров: 465; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!