Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AlgStr / Лекции.doc
Скачиваний:
44
Добавлен:
23.03.2015
Размер:
741.89 Кб
Скачать

Лекция 9. Реалізація абстракції даних. Функція абстракції. Функція інваріант подання.

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

Функция абстракции

Любая реализация абстракции данных должна определять, как представляются объекты, принадлежащие к этому типу. Выбирая представление, тот, кто занимается реализацией, учи­тывает связь между объектами представления и абстрактными объ­ектами. Предполагается, что определенные объекты представле­ния будут соответствовать определенным абстрактным объектам. Например, на рис. 4,5наборыintsetпредставляются массивами, элементы которых соответствуют элементам набора.

Эта взаимосвязь может быть определена функцией, которая называется функцией абстракции.Эта функция отображает объ­екты представления в абстрактные объекты:

А: repА

Здесь Аобозначает набор абстрактных объектов. Для каж­дого объекта представленияr, А(r) является абстрактным объ­ектом аA,который представляет r.

Рис. 1. Пример функции абстракции.

Например, функция абстракции для реализацииintsetото­бражает массивarray[int 1в наборintset. На рис. 4.8показаны отображения некоторых точек функции абстракции. Заметим, что А может отображать различные элементы в один, т. е. различным объектам представления может соответствовать один и тот же абстрактный элемент из Например, II:1,2]и [1:2,1] представляют один наборintset {1, 2}.В том, что функция абстракции часто отображает различные элементы в один, нет ничего удиви­тельного, так как процесс абстракции отбрасывает не относя­щуюся к делу информацию. В нашем примере такая информация - это расположение элементов в массиве.

Функция абстракции —это важнейшая информация о реали­зации. Она определяет конкретное представление, т. е. то, каким образом объекты представления реализуют абстрактные объ­екты. Эта функция должна быть обязательно представлена в ком­ментариях реализации. Описывая функцию реализации, мы иногда сталкиваемся с проблемой, связанной с тем, что, если спецификация типа неформальная, область изменения функции абстракции не может быть точно определена. Сейчас мы будем преодолевать эту Проблему с помощью неформального описания «типичного» абстрактного объекта. Когда (в гл. 10)мы будем обсуждать формальные спецификации, то увидим, что они дают нам возможность довольно точно определять области изменения для функций абстракций.

Для определения функции абстракции прежде всего опреде­ляем типичный элемент абстрактного типа. Это дает нам воз­можность говорить об абстрактных объектах. Затем можем оп­ределить функцию абстракции в терминах этого типичного объ­екта. Например, для наборов intsetмы можем дать следующее описание:

%Типичный наборintsetесть: {х1, ...хп}

Здесь для описания наборов intsetиспользуем понятие мате­матического набора, точно так же, как делали это в специфи­кацииintset. Затем пишем

%Функция абстракции есть

% А (г) = \r [ill low (r) < i < high (r)},

где \xlp(x)} есть набор всех таких х, что р (х) имеет значениеtrue.

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

%Типичный полином есть:c0+ c1x+c2x2+ …

%Функция абстракции для коэффициентаc1есть

1 =r[i ],еслиlow(r) <=i<=high (г)

% = 0в противном случае

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

Функция абстракции, в частности, удобна тем, что устраняет двусмысленности в интерпретации представления. Например, предположим, что с помощью массивов мы реализуем стеки. Мы можем выбирать, каким образом увеличивать массив, когда в стек добавляется новый элемент. Этот наш выбор будет отражен в функции абстракции. Если мы решаем увеличивать старший ин­декс массива и по этому индексу записывать элемент, то функция абстракции будет следующая:

%Типичный стек—это последовательность [е1, ...,еn], где

n —элемент со старшим индексом

%Функция абстракции есть

% А (г) = [r [low (r)], ..., r [high (r)]]

Если мы решаем уменьшать младший индекс и по этому ин­дексу записывать элемент, то

% А (r) = [r [high (r)], ..., r [low (r) 1]

Заметим, что реализации стеков, о которых мы только что го­ворили, используют одно и то же представление, которое интер­претируется, однако, по-разному.

Соседние файлы в папке AlgStr