数组定义和运算
① 数组是高级语言一般都支持的数据类型,这里学习数组在计算机内部如何处理,主要是存取,地址计算;
② 从逻辑结构上看,数组可以看成是一般线性表的扩充。
二维数组视作线性表
① 把矩阵Am×n
看成n个列向量的线性表:
A=(α1,α2…αj…αn)
,
αj=(a1j,a2j, …,amj)
,(1 ≤ j ≤ n)
本身也是一个线性表,称为列向量。
②把矩阵Am×n
看成m个行向量的线性表:
B=(β1,β2, ...βi…,βm)
,
βi = (ai1, ai2, …, aij, …, ain)
,(1 ≤ i≤ m)
称为行向量。
高维数组
同理,嵌套(或降维)思路。
三维数组:每个元素为二维数组的线性表。
N维数据:每个元素为N-1维数据的线性表。
数组运算
① 数组是一组有固定个数的元素的集合。
维数、每维上下限确定,元素个数就确定,使得对数组的操作不象对线性表的操作那样,可以在表中任意一个合法的位置插入或删除一个元素。
② 数组操作一般只有两类:
取值:获得特定位置的元素值;
修改:修改特定位置的元素值。
PS:数组的抽象数据类型定义数组下标从1开始,与C语言不同。
数组的顺序存储和实现
数组的顺序存储结构有两种:
一种是按行序存储,如高级语言BASIC、COBOL、PASCAL和C语言都是以行序为主。
另一种是按列序存储,如高级语言中的FORTRAN语言就是以列序为主。
二维数组略(见前)。
三维数组:可行纵列为主序存储,如A3×4×2
逻辑结构图:
数组地址计算:
元素地址 = 首元素地址 + 偏移量(与首距离)
偏移量 = 间隔元素个数 x size(单元素空间)
一维数组:
Loc(A[i])=Loc(A[i])+(i-1)*size
.
二维数组:
行存储二维数组Am×n
,下标从1开始,任意元素aij的地址
Loc[i,j]=Loc[1,1]+(n×(i-1)+j-1)×size
,每个元素占size个存储单元,每个元素占1个存储单元 Loc[i,j]=Loc[1,1]+n×(i-1)+(j-1)
。
三维数组:
三维数组A(1..r,1..m,1..n)
可以看成是r个m×n的二维数组。
假定每个元素占1个存储单元,行主序存放,首元素a111地址为Loc[1][1][1]
ai11地址:
Loc[i][1][1] = Loc[1][1][1] + (i-1)*m*n
,
aijk地址:
Loc[i][j][k] = Loc[1][1][1] + (i-1)*m*n + (j-1)*n+(k-1)
其中1≤i≤r
,1≤j≤m
,1≤k≤n
。
一般情况:
用j1,j2,j3代替数组下标i,j,k,下限分别为c1,c2,c3,上限分别为d1,d2,d3.
任意元素aj1j2j3地址:
Loc[j1][j2][j3]=Loc[c1][c2][c3]+((d2-c2+1)*(d3-c3+1)*(j1-c1)+(d3-c3+1)*(j2-c2)+(j3-c3))*size
.
n维数据地址计算: