第五章 数组和广义表
5.1 数组的类型定义
ADT Array {
数据对象:
D={aj1,j2, ...,,ji,jn| ji =0,...,bi -1, i=1,2,..,n }
数据关系:
R={R1, R2, ..., Rn}
Ri={<aj1,... ji,... jn , aj1, ...ji +1, ...jn > | 0 £ jk £ bk -1,
1 £ k £ n 且k ¹ i, 0 £ ji £ bi -2, i=2,...,n }
} ADT Array
基本操作
InitArray(&A, n, bound1, ..., boundn)
DestroyArray(&A)
Value(A, &e, index1, ..., indexn)
Assign(&A, e, index1, ..., indexn)
InitArray(&A, n, bound1, ..., boundn)
操作结果:若维数 n 和各维长度合法,则构造相应的数组A,并返回OK。
DestroyArray(&A)
操作结果:销毁数组A。
Value(A, &e, index1, ..., indexn)
初始条件:A是n维数组,e为元素变量,随后是n 个下标值。
操作结果:若各下标不超界,则e赋值为所指定的A 的元素值,并返回OK。
Assign(&A, e, index1, ..., indexn)
初始条件:A是n维数组,e为元素变量,随后是n 个下标值。
操作结果:若下标不超界,则将e的值赋给所指定的A的元素,并返OK。
二维数组的定义:
数据对象:
D = {aij | 0≤i≤b1-1, 0 ≤j≤b2-1}
数据关系:
R = { ROW, COL }
ROW = {<ai,j,ai,j+1> | 0≤i≤b1-2, 0≤j≤b2-1}
COL = {<ai,j,ai+1,j> | 0≤i≤b1-1, 0≤ j≤b2-2}
二维数组的定义:
5.2 数组的顺序表示和实现
类型特点:
(1) 只有引用型操作,没有加工型操作;
(2) 数组是多维的结构,而存储空间是一个一维的结构。
有两种顺序映象的方式:
(1)以行序为主序
(2)以列序为主序
以“行序为主序”的存储映象:
二维数组A中任一元素ai,j 的存储位置
LOC(i,j) = LOC(0,0) + (n×i+j)×
称为基地址或基址
以“列序为主序”的存储映象:
二维数组A中任一元素ai,j 的存储位置
LOC(i,j) = LOC(0,0) + (m×j+i)×L
推广到一般情况,可得到 n 维数组数据元素存储位置的映象关系
LOC(j1, j2, ..., jn ) = LOC(0,0,...,0) + ∑ ci ji
其中 cn = L,ci-1 = bi ×ci , 1 < i £ n。称为 n 维数组的映象函数。数组元素的存储位置是其下标的线性函数。
5.3 矩阵的压缩存储
以常规方法,即以二维数组表示高阶的稀疏矩阵时产生的问题:
(1) 零值元素占了很大空间;
(2) 计算中进行了很多和零值的运算。
解决问题的原则:
(1) 尽可能少存或不存零值元素;
(2) 尽可能减少没有实际意义的运算;
(3) 操作方便。 即:能尽可能快地找到与下标值(i,j)对应的元素,能尽可能快地找到同一