Заметим, что такой способ разрешения коллизий работает даже тогда, когда коэффициент заполнения превысит 1. Вместо списков для разрешения коллизий можно использовать деревья. Две другие важные операции – вставка и удаление – практически идентичны поиску. Следовательно, эффективность этих операций равна эффективности поиска Θ(1), если мало коллизий.
Хеш-таблицы
В случае закрытого хеширования вся информация хранится в самой хэш-таблице, без использования связанных списков или деревьев (само собой, это приводит к требованию, чтобы размер хэш-таблицы m был не меньше количества информации n). Для разрешения коллизий могут применяться разные стратегии.
Хеш-таблицы
Хеш-таблицы
Математический анализ линейного исследования – существенно более сложная задача, чем анализ хеширования с раздельными цепочками. Упрощенная версия полученных при таком анализе результатов гласит, что среднее количество обращений к хеш-таблице с коэффициентом заполнения ά в случае успешного и неудачного поиска равно соответственно S ≈ ½ (1+1/(1-ά)) и U ≈ ½ (1+1/(1-ά)²). По мере заполнения хеш-таблицы производительность линейного исследования ухудшается из-за эффекта кластеризации.
Хеш-таблицы
B-деревья
Идея использования дополнительной памяти для ускорения доступа к данным особенно важна, если рассматриваемый набор данных содержит большое количество записей, которые требуется хранить на диске. Основной метод организации таких наборов данных – индексы, которые представляют определенную информацию о размещении записей с указанными значениями ключей. Для наборов данных, состоящих из структурированных записей наиболее важной организацией индексов являются B-деревья, разработанные Р. Бойером и Э. Мак-Грейтом. Они расширяют идею 2-3-деревьев.
B-деревья
B-деревья
B-деревья
Если в нем есть место для нового ключа, мы вставляем его (в соответствующую позицию, так, чтобы ключи в листе остались отсортированными), и на этом работа завершается. Если же в листе нет места для новой записи, лист разбивается на два, при этом вторая половина записей переходит в новый узел. После этого наименьший узел K’ нового узла и указатель на него встраиваются в родительский узел старого листа (непосредственно после ключа и указателя на старый лист). Эта рекурсивная процедура может распространяться вплоть до корня дерева. Если корень также заполнен, старый корень разбивается на две части, и создается новый корень, у которого две части старого корня становятся дочерними узлами.
B-деревья
Существуют и другие алгоритмы для реализации вставки информации в В-дерево. Например, мы можем избежать возможного рекурсивного разделения заполненных узлов, если будем разделять при поиске листа для новой записи. Еще одна возможность избежать рекурсивного разделения заполненных узлов заключается в перемещении ключа в «братский» узел.
Спасибо за внимание
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.