Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

К9-12В. Вопросы и ответы к ГОСам 2013 / Программирование на языке высокого уровня / 07. Таблица произвольного доступа. Определение, основные операции, отображение в памяти. Функция рандомизации, ее назнач

.docx
Скачиваний:
93
Добавлен:
10.05.2014
Размер:
37.23 Кб
Скачать

07. Таблица произвольного доступа. Определение, основные операции, отображение в памяти. Функция рандомизации, ее назначение.

Таблицы произвольного доступа

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

Пусть таблица содержит M записей со значениями ключей k1, k2, ..., kM(все значения ключей разные) и отображается в вектор A из N элементов A[0], A[2], ..., A[N-1], причем M N.

Пусть определена функция расстановки I(k), такая, что для любого ki, i = 1, 2, ..., M I(ki) имеет целое значение от 0 до N-1. При этом I(ki) I(kj) для любых kikj, т.е. элемент таблицы с ключом k взаимно однозначно отображается в элемент вектора A[I(k)]. Такие таблицы и являются таблицами произвольного доступа(RandomAccess), а функция расстановки для таких таблиц получила название функции рандомизации.

Таким образом, функция рандомизации обеспечивает вычисление для каждого элемента таблицы индекса соответствующего элемента вектора A. Доступ к элементу таблицы по ключу k осуществляется в этом случае непосредственно путем вычисления значения I(k). Максимальная и средняя длины поиска в таких таблицах минимальны и равны: T = D = 1.

Таблицы произвольного доступа обладают целым рядом важных свойств, существенно влияющих на их использование:

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

  2. Так как ключи не хранятся в элементах таблицы, при занесении элементов в таблицу или поиске элементов в таблице нужно иметь возможность определять, занята позиция таблицы или свободна. Для этого достаточно включить в элемент таблицы дополнительное поле занятости (по аналогии с динамической просматриваемой таблицей-вектором: значение 0 в этом поле указывает на то, что позиция свободна, 1 – позиция занята); тогда структура элемента таблицы может быть представлена следующим образом;

struct Item{

int busy; /* признак занятости позиции таблицы */

Type info;

};

  1. В силу сложности подбора функции рандомизации часто таблицы произвольного доступа имеют не очень высокую степень наполненности таблицы , которую можно определить следующим образом:

где M – общее количество элементов, размещенных в таблице (размер таблицы),

N – размер вектора, на который отображается таблица.

Обычно < 1 и даже могут иметь случаи, когда << 1.

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

Рассмотрим пример. Пусть в таблице должны размещаться элементы с ключами (всего 14 элементов):

12, 48, 3, 5, 7, 63, 15, 202, 103, 188, 30, 43, 6, 18

В качестве одного из вариантов функции расстановки можно взять I(k) = k – 1; тогда в векторе должен быть элемент с индексом 201 (чтобы отобразить в вектор элемент с максимальным значением ключа 202). Из этого следует, что таблица-вектор должна содержать 202 элемента, из которых будут использованы только 14, т.е. степень наполненности таблицы

Если в качестве функции рандомизации взять I(k) = k%50, тогда таблица должна иметь 50 элементов, и степень наполненности таблицы

Однако если в таблицу потребуется добавить элемент с ключом 62, для этого ключа функция рандомизации даст значение 12, совпадающее со значением производного ключа для первого элемента (с ключом 12), и потребуется менять функцию рандомизации.

В качестве иллюстрации сложности подбора функции расстановки приведу выдержку из монографии Д.Кнута "Искусство программирования для ЭВМ, т. 3. Сортировка и поиск": " ... Существует 4131 1050 различных отображений множества из 31 элемента в множество из 41 элемента, и только 4140 ... 11 = 1043 из них дают различные значения для каждого аргумента; таким образом, лишь одна из каждых 10 миллионов функций оказывается подходящей." (стр. 601).

Реализация функций работы с таблицами произвольного доступа не вызывает никаких затруднений; главная проблема здесь – подбор функции рандомизации.

Соседние файлы в папке Программирование на языке высокого уровня