Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
структуры и алгоритмы / Лекции_лабор_структ.doc
Скачиваний:
56
Добавлен:
04.06.2015
Размер:
2.98 Mб
Скачать

2.3 Массивы

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

Если массив состоит из векторов, элементами которых являются простые данные (скаляры), то логическая структура такого массива может быть представлена прямоугольной матрицей, в которой любой ее элемент может быть однозначно идентифицирован указанием пары индексов, при этом первый индекс задает номер строки, а второй - номер столбца, на пересечении которых расположен элемент. Матрицу называют двумерным массивом. От двумерного массива нетрудно перейти к трехмерному массиву, в котором каждый скалярный элемент (или просто элемент массива) однозначно идентифицируется упорядоченной тройкой индексов. Формально можно определить массив произвольной конечной размерности, в котором каждый элемент однозначно определяется конечной упорядоченной последовательностью индексов, или селекторов, причем число таких индексов равно размерности массива. Из этого определения ясно, что вектор - одномерный массив. Кроме того, скалярную величину можно считать нуль-мерным массивом. Еще раз подчеркнем, что все элементы массива принадлежат одному и тому же типу данных.

Дадим еще одно формальное определение массива. Назовем k-мерным массивом, где k=1,2, ... , конечное упорядоченное множество (k-1)-мерных массивов, все элементы которых принадлежат одному и тому же типу. При k=1 получается вектор (если нуль-мерный массив считать скаляром).

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

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

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

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

Пусть задан произвольный n-мерный массив

,

в котором каждая пара величин целого типа указывает верхнюю и нижнюю границыs-го индекса, где s=1,2, …, n..

Пусть - произвольный элемент логической структуры вектораВ. Определим функцию упорядочения в виде

,

где N – номер слота в физической структуре, соответствующий элементу .

Величина в этом выражении зависит от способа отображения массиваВ. При отображении строками

а при отображении столбцами

Если длина слота равна l ячейкам памяти, то следующее выражение позволяет вычислить адрес произвольного элемента , если известен адрес первого элемента:

,

где величина определяется в зависимости от способа отображения массива В, как описано выше.

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

Для ускорения доступа к каждому элементу массива можно заранее вычислить индексные множители дляm=1,2,…,n и запомнить их в дескрипторе массива.

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

Пример дескриптора трехмерного массива MATR(2:3,4:6,1:5) с элементами целого типа, для хранения каждого из которых отводится l=2 ячейки (байта) памяти, представлен на рис. 2.2.

A

MATR

ADDR(MATR(2,4,1))

ADDR(MATR(2,4,1))-102

3

2

3

4

6

1

5

30

10

2

INTEG

2


Рис. 2.2 - Пример дескриптора трехмерного массива с элементами целого типа

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

Пятое поле дескриптора содержит значение размерности массива, следующие поля 6-11 – граничные значения индексов. В полях 12-14 записаны значения индексных множителей , используемых для убыстрения вычисления адреса элемента в памяти, а поле 15 содержит признак типа данных. И, наконец, последнее поле хранит значение длины слота.

Пусть начальный адрес массива MATR=1000. Тогда его элемент с индексами 2, 5, 4 будет располагаться по адресу

ADDR(MATR(2,5,4))=ADDR(MATR(2,4,1))-102+30*2+10*5+4*2=1000-102+118=1016.

Важный частный случай двумерного массива – симметричная матрица, у которой элементы, расположенные симметрично относительно главной диагонали, попарно равны друг другу. Такова, например, корреляционная матрица системы случайных величин. Если квадратная матрица порядка n симметрична, то в ее физической структуре достаточно отобразить не , а лишьn(n+1)/2 ее элементов, в том числе элементы главной диагонали, и, например, все элементы, расположенные над этой диагональю. Иными словами, в памяти достаточно представить лишь верхний (включая и диагональ) треугольник квадратной логической структуры, поэтому соответствующий двумерный массив часто называют треугольным массивом.

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