Страница 6


Решение проблем коллизий

Метод цепочек или прямое связывание [5, c. 170-171]

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

Рисунок 6.1 - хеш-таблица с прямым связыванием

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

Чтобы найти нужный элемент, программе необходимо хешировать ключ и определить, в каком из блоков он может содержаться, а затем двигаться по связному списку до тех пор, пока не будет достигнут его конец или не обнаружится искомое. Если вы доберётесь до конца списка, значит, запрашиваемого элемента в хеш-таблице нет. Как и в случае с добавлением элемента, предстоит выполнить O(N/B) шагов.

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


1Удаление элементов в данном методическом материале рассматриваться не будет