Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структуры данных / Си структуры данных1.doc
Скачиваний:
47
Добавлен:
23.02.2015
Размер:
1.29 Mб
Скачать

3.2.3. Операции

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

В соответствии с формулами (3.3), (3.4) и по аналогии с вектором (3.1), (3.2) для двумерного массива с границами изменения индексов:

[ B(1) ][ B(2) ], размещенного в памяти по строкам, адрес элемента с индексами [I(1),I(2)] может быть вычислен как:

Addr[I(1),I(2)] = *( *(Addr+I(1) ) + I(2) )

Обобщая (3.5) для массива произвольной размерности:

Mas[B(1)][B(2)]...[B(n)] , получим

, (3.6)

Одно из определений массива гласит, что это вектор, каждый элемент которого - вектор. Некоторые языки программирования позволяют выделить из многомерного массива одно или несколько измерений и рассматривать их как массив меньшей мерности.

Например: если в PL/1 - программе объявлен двумерный массив:

DECLAREA(10,10)BINARYFIXED;

то выражение A[*,I] - будет обращаться к одномерному массиву, состоящему из элементов: A(1,I), A(2,I),...,A(10,I).

Символ-джокер "*" означает, что выбираются все элементы массива по тому измерению, которому соответствует заданный джокером индекс. Использование джокера позволяет также задавать групповые операции над всеми элементами массива или над выбранным его измерением, например: A(*,I) = A(*,I) + 1.

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

3.2.4. Адресация массивов с помощью векторов Айлиффа

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

Для массива любой мерности формируется набор дескрипторов: основного и несколько уровней вспомогательных дескрипторов, называемых векторами Айлиффа. Каждый вектор Айлиффа определённого уровня содержит указатель на нулевые компоненты векторов Айлиффа следующего, более низкого уровня, а векторы Айлиффа самого нижнего уровня содержат указатели групп элементов отображаемого массива. Основной дескриптор массива хранит указатель вектора Айлиффа первого уровня. При такой организации к произвольному элементу В[j1][j2]...[jn] многомерного массива можно обратиться пройдя по цепочке от основного дескриптора через соответствующие компоненты векторов Айлиффа.

На рис. 3.4 приведена физическая структура трёхмерного массива В[2]-[1][2], представленная по методу Айлиффа. Из этого рисунка видно, что метод Айлиффа, увеличивая скорость доступа к элементам массива, приводит в то же время к увеличению суммарного объёма памяти, требуемого для представления массива. В этом заключается основной недостаток представления массивов с помощью векторов Айлиффа. На практике в языке С, данный метод не используется за ненадобностью (способ с разыменованием указателей, как раз придставляет собой доступ по векторам различных уровней ), а в языке Pascal, он может существенно сократить время доступа к элементу.

Рис. 3.4. Представление массивов с помощью векторов Айлиффа