Размещение прямоугольных массивов в последовательной памяти
В качестве примера рассмотрим трёхмерный прямоугольный массив (3 слоя по 4 строки по 5 элементов в строке). Такой массив можно представить в виде параллелепипеда (рис 3.). Предположим, что элементы массива следуют в памяти в лексикографическом порядке, то есть так, что первым изменяется последний индекс. Такой порядок используется в большинстве алгоритмических языков, но есть и исключения, например, Фортран. Порядковый номер элемента массива A[i][j][k] можно вычислить по формуле:
i | * | Объем слоя | + | j | * | Длина строки | + | k |
В общем случае описание массива может иметь вид:
A[i1:j1][i2:j2]…[in:jn]
где im, jm – нижняя и верхняя граница индекса в m-м измерении. Каждый раз, когда программа обращается к элементу массива, она должна вычислить его адрес по заданным индексам k1,k2…kn. Функция упорядочения, которая это делает, имеет вид:
где L – искомый адрес; b – начальный адрес массива (адрес его 1-го элемента); Dm – объем m-го сечения массива (слоя, строки…) в байтах. В общем случае функцию упорядочения можно записать в виде:
, где
Константу с называют базовым адресом массива, который определяется как адрес возможно несуществующего элемента массива, у которого все индексы равны нулю.
Пример: для массива с границами индексов 3:5,1:4,0:1 имеем:
D3=1
D2=(j3-i3+1)*D3=2
D1=(j2-i2+1)*D2=8
с=b-(i1*D1+i2*D2+i3*D3)=26*(b-1)
И функция упорядочения имеет вид:
L=25*(b-1)+8*k1+2*k2+k3
Функция упорядочения строится компиляторами автоматически. Исходные данные о массиве представляются обычно в виде информационного вектора массива:
IA=(n, число элементов, C, D1, D2,…Dn, i1, j1, i2, j2,…in, jn)
Дата добавления: 2014-12-02; просмотров: 802;