Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
pis_lect.docx
Скачиваний:
24
Добавлен:
28.10.2018
Размер:
2.55 Mб
Скачать

2.3.4. Расстановка (хеширование) записей. (вопрос 14)

В некотором смысле альтернативным подходом к организации физических структур данных является расстановка записей. Как и при использовании линейных и нелинейных структур, основной задачей расстановки записей является минимизация расходов на доступ и изменение данных во внутренней и внешней памяти.

Идея расстановки записей, в англоязычной литературе- hash coding- хеширование, заключается в том, чтобы при выделении под размещение данных определенного участка памяти так организовать порядок расположения записей в нем, чтобы место для новых записей и поиск старых записей можно было производить на основе некоторого преобразования их ключевых полей. (Отсюда еще одно название данного подхода – «преобразование ключей», введенное в русской литературе в 1956 году академиком А.П. Ершовым).

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

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

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

Таким образом, в идеале хеширование обеспечивает доступ к нужным записям за одно обращение к области размещения данных.

2.3.4.1. Расстановка записей по числовому значению ключей.

Функция преобразования h(Клj) выбирается на основе двух требований:

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

  2. значение функции в пределах выделенного диапазона адресов должны быть равномерными.

На практике наиболее широкое распространение нашли хеш-функции, основанные на операциях деления по модулю:

h (Кл j ) = ( Кл j mod M)+1,

где (Кл j mod M) означает операцию деления по модулю М, а число М выбирается исходя из необходимости попадания значений хеш-функции в требуемый диапазон.

Рис. 2.20. Принцип расстановки записей по значению ключей.

Значением операции деления по модулю М является остаток от обычного деления числа на М, например результат деления 213 по модулю 20 равен 13.

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

2.3.4.2. Расстановка записей по текстовым ключевым полям.

Для текстовых ключевых полей обычно применяют подобные подходы, основанные на использовании операции сложения по модулю значений кодов первых нескольких символов ключа.

Основной проблемой хеширования с прямой адресацией записей является возможность появления одинаковых значений хеш-сверток при разных значениях полей (так называемые синонимы).

Такие ситуации называются hash collision-коллизиями, так как требуют определенного порядка, правил их разрешения.

Для разрешения коллизий применяются два подхода.

Первый подход основывается на использовании технологии цепных списков. Этот подход состоит в присоединении к конфликтующим записям, специальных дополнительных указателей, по которым размещаются новые записи. Как правило, для таких записей отводится специально выделенный участок памяти, называемый областью переполнения.

В алгоритм доступа добавляются операции перехода по цепному списку для нахождения искомой записи.

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

Второй подход разрешения коллизий основывается на использовании дополнительного преобразования ключей по схеме:

n i (доп.) = h (Кл i) + g (Кл i) = n i (о) + g (Кл i),

где n i (о) – исходное конфликтующее значение адреса записи;

g (Кл i) - дополнительное преобразование ключа;

n i (доп.) – дополнительное значение адреса.

Может встретиться ситуация, когда и такое дополнительное преобразование вновь приводит к коллизии, т.е. полученное значение n i (доп.) также оказывается занятым.

Чтобы преодолеть такую ситуацию дополнительное преобразование g (Кл i) организуют на основе рекуррентной процедуры по следующей схеме:

n i(k) = n i(k-1) + f (k),

где f (k) – некоторая функция над номером итерации (пробы).

В зависимости от вида функции f(k) такие подходы называют линейными или квадратичными пробами.

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

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

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

Рис. 2.21. Принцип хеширования записей по страницам файла данных.

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

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

Для смягчения подобных ситуаций могут применяться комбинации хеширования и структуры Б-деревьев для размещения записей по страницам в случаях переполнения.

Внутренняя схема базы данных обычно скрыта от пользователей ИС, за исключением возможности установления и использования индексации полей. Вместе с тем, особенности физической структуры файлов данных и индексных массивов, принципы организации и использования дискового пространства и внутренней памяти, реализуемые конкретной СУБД, должны учитываться проектировщиками банков данных. Эти «прозрачные» (невидимые) для пользователей - абонентов особенности СУБД критично влияют на эффективность обработки данных в информационной системе.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]