第5章 数组和广义表
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.1数组的定义
一维数组的特点: 1个下标,ai 是ai+1的直接前驱 二维数组的特点: 2个下标,每个元素ai,j受到两个关系 (行关系和列关系)的约束 N维数组的特点: n个下标,每个元素受到n个关系约束 一个n维数组可以看成是由若干个n-1维数组组成的线性 表 当n=1时,n维数组就退化为定长的线性表。因此,n维数 组是线性表的扩广
• 按对角线映射 A[i - 2] i j 1 A[n i 2], i j M (i, j ) A[2 * n i 2], i j - 1 0, otherwise 14 19 5 8 3
A[3j- 2] i j 1 A[3 j 3], i j 2 4 23 7 9 M (i, j ) A[3 j 4], i j - 1 • 按列优先映射 0, ot herwise
按行主次序 2 4 7 23 9 19 14 8 5 3
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
www.zzuli.edu.cn
5.3.1特殊矩阵
4、对称矩阵 只存储上三角/下三角部分 存储映射方式参照上三角/下三角矩阵 例如,只存储下三角,按行主次序,则
www.zzuli.edu.cn
5.3.1特殊矩阵
例、将一个A[1..100,1..100]的三对角矩阵,按行优先存入一 维数组B[1…298]中,A中元素a66,65(即该元素下标i=66, j=65)在B数组中的位置k为 B 。 A、198 B、195 C、197 D、196 例、已知有一维数组A[0…m*n-1],若要对应为 m 行、n 列的 矩阵,则下面的对应关系 A.i=k/n, j=k%m 可将元素A[k](0≤k<m*n)表示 B.i=k/m, j=k%m 成矩阵的第 i 行、第j列的元素(0≤i<m,0≤j<n)。
数组基址 aij之前的行数 总列数,即 第2维长度 aij本行前面的 元素个数 单个元 素长度
二维数组列优先存储的通式为: LOC(aij)=LOC(ac1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L
www.zzuli.edu.cn
5.2数组的顺序表示和实现
例:设二维数组 A[m][n]按行优先顺序存储,假设A[0][0]存放 位置在 644(10), A[2][2]存放位置在 676(10),每个元素占一个空 间,问A[3][3](10)存放在什么位置?脚注(10)表示10进制。 解:设元素A[i][j]存放在起始地址为Loc ( i, j ) 的存储单元中 ∵ Loc ( 2, 2 ) = Loc ( 0, 0 ) + 2 * n + 2 = 644 + 2 * n + 2 = 676. ∴ n = ( 676 - 2 - 644 ) / 2 = 15 ∴ Loc ( 3, 3 ) = Loc ( 0, 0 ) + 3 * 15 + 3 = 644 + 45 + 3 = 692. 例:设二维数组A[10,20]的每个元素占两个字节, A[0][0]的存 储地址为100,若按行优先顺序存储,则元素A[6,6]的存储地址 为 352 ,按列优先顺序存储,元素A[6,6]的存储地址为 232 。 (6*20+6)*2+100=352 (6*10+6)*2+100=232
数组的抽象数据类型定义参见教材P90
6
www.zzuli.edu.cn
5.2数组的顺序表示和实现
以行序为主序 如C, PASCAL
www.zzuli.edu.cn
5.2数组的顺序表示和实现
以列序为主序 如FORTRAN
www.zzuli.edu.cn
5.2数组的顺序表示和实现
若二维数组a[n][m]以行序优先存储:
a[0][0] a[1][0] a[ 2][0] a[ n 1][0] a[0][1] a[1][1] a[ 2][1] a[0][m 1] a[1][m 1] a[ 2][m 1] a[ n 1][m 1]
4
0 7 0 0 0 0 19 0 0 0 0 3
2
7 19 3
[0] [1] [2] [3]
www.zzuli.edu.cn
5.3.1特殊矩阵
2、三对角矩阵 只存储三个对角线上的元 素(按行存储); 一维数组空间需要: (3n-2) *sizeof(T) 1 2 3 4 M 1 2 23 0 0 2 4
Loc(aij)=Loc(a11)+[(j-1)*m+(i-1)]*K (尽管是方阵,公式不同) 例:设数组a[1…60, 1…70]的基地址为2048,每个元素占2 个存储单元,若以列序为主序顺序存储,则元素a[32, 58] 8950 的存储地址为 。 答:请注意审题! 利用列优先通式: LOC(aij)=LOC(ac1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L 得:LOC(a32,58)=2048+[(58-1)*(60-1+1)+32-1)]*2=8950
www.zzuli.edu.cn
5.1数组的定义
由于数组中各元素具有统一的类型,并且数组元素的下 标一般具有固定的上界和下界;除了结构的初始化和销 毁之外,数组只有存取元素和修改元素值的操作,因此, 数组的处理比其它复杂的结构更为简单。多维数组是向 量的推广。例如,二维数组:
(a11 (a 21 ( ... a m1 (
数据结构
软件学院 2013.9
第5章 数组和广义表
数组的定义
数组的顺序表示和实现
矩阵的压缩存储 广义表的定义 广义表的存储结构
www.zzuli.edu.cn
2
数组和广义表:特殊的线性表 元素的值并非原子类型,可以再分解,表中元 素也是一个线性表(即广义的线性表) 所有数据元素仍属同一数据类型 高级语言中的数组是顺序结构; 而本章的数组既可以是顺序的,也可以是链式结 构,用户可根据需要选择
www.zzuli.edu.cn
5.3矩阵的压缩存储
矩阵是科学与工程计算问题中常用的数学对象。在高级语 言编制程序时,简单而又自然的方法,就是将一个矩阵描 述为一个二维数组 什么是压缩存储? 若多个数据元素的值都相同,则只分配一个元素值的 存储空间,且零元素不占存储空间 所有二维数组(矩阵)都能压缩吗? 未必,要看矩阵是否具备以上压缩条件。 什么样的矩阵具备以上压缩条件? 一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵 ,稀疏矩阵等。 什么叫稀疏矩阵? 矩阵中非零元素的个数较少(一般小于5%)
A[3i 4] i j 1 A[3i 3], i j M (i, j ) A[3i 2], i j - 1 0, ot herwise
3 0 4 0
7 9 0
14 0 19 8 5 3
A 2 23 4 7 14 9 19 8 5 3
M ( j, i) A[ j ( j 1) / 2 i 1], i j M (i, j ) A[i(i 1) / 2 j 1], i j
www.zzuli.edu.cn
5.3.1特殊矩阵
特殊矩阵压缩存储小结:
只存储上三角/下三角部分; 找出特殊矩阵中特殊元素的分布规律; 把有一定分布规律的、值相同的元素(包括零)压 缩存储在一个存储空间中; 在算法中按公式作一映射即可实现矩阵元素的随机 存取。
www.zzuli.edu.cn
5.3.1特殊矩阵
对角矩阵:所有非0元素都在对角线上,即当i≠j 时有M(i, j) = 0 。 三对角矩阵: | i - j | > 1 时有M(i, j ) = 0 下三角矩阵: i < j 时有M (i, j ) = 0 上三角矩阵: i > j 时有M (i, j ) = 0 对称矩阵: M (i, j ) =M (j, i )
www.zzuli.edu.cn
5.3.1特殊矩阵
3、三角矩阵
www.zzuli.edu.cn
5.3.1特殊矩阵
下三角矩阵:只存储对角线以下的元素: 1 1 2 2 3 4
0 0 0 2 4 7 0 0 3 23 9 19 0 4 14 8 5 3
M
A
0, i j M (i, j ) A[i(i 1) / 2 j 1], i j
a
a[ n 1][1]
若每个元素占L个存储单元,则有: LOC (i, j ) = LOC(0,0) + (m ×i + j)L
aij的存储地址
www.zzuli.edu.cn
a00的存储地址 (基地址或基址)
5.2数组的顺序表示和实现
无论规定行优先或列优先,只要知道以下三要素便可随时求 出任一元素的地址(这样数组中任一元素便可随机存取): ①开始结点的存放地址(即基地址) ac1,c2 … ac1,d2 ②维数和每维的上、下界; Amn= … aij … ③每个数组元素所占用的单元数 ad1,c2 … ad1,d2 计算二维数组元素地址的通式: 设一般的二维数组是A[c1..d1, c2..d2],c1、c2不一定是0 则行优先存储时的地址公式为: LOC(aij)=LOC(ac1,c2)+[(i-c1)*(d2-c2+1)+j-c2)]*L
www.zzuli.edu.cn
5
5.1数组的定义
n维数组的数据类型定义:
n_ARRAY = (D, R)
其中:
Fra Baidu bibliotek
数据对象:D = {aj1,j2…jn| ji为数组元素的第i 维下标 , aj1,j2…jn Elemset }
数据关系:R = { R1 ,R2,…. Rn } Ri = {<aj1,j2,…ji…jn , aj1,j2,…ji+1…jn >| aj1,j2,…ji…jn , aj1,j2,…ji+1…jn D } 基本操作:构造数组、销毁数组、读数组元素、写数组元素
)
a12
Amn
a 22 ... am2
可以看成是由一个行向量组成的向量,也可以看成是由 一个列向量组成的向量。
www.zzuli.edu.cn
4
(
( ( (
(
) ) )
)
... ... a1n ) ... ... a 2 n ) ... ... ... ) ) ... ... a mn
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
www.zzuli.edu.cn
5.3.1特殊矩阵
另外的存储映射方式 1 1 2 3 4
4
9
5
2
7 19 3 23 14 8
2 23 0 0 4 7 14 0 2 3 0 9 19 8 0 0 5 3 4
www.zzuli.edu.cn
5.3.1特殊矩阵
对称矩阵示例:任意两个城市之间的距离可以用一个 6 ×6 的矩阵来表示。矩阵的第i行和第i列代表第i个城市, distance (i, j ) 代表城市i和城市j之间的距离。
www.zzuli.edu.cn
5.3.1特殊矩阵
1、对角矩阵 使用二维数组:空间需要n2*sizeof(T) 压缩存储:只存储对角线上的元素 使用一维数组:空间需要n*sizeof(T) M(i,i) =A[i-1] 1 2 3 4 A M 1 2 0 0 0 2 3
www.zzuli.edu.cn
5.2数组的顺序表示和实现
例:一个二维数组A,行下标的范围是1到6,列下标的范 围是0到7,每个数组元素用相邻的6个字节存储,存储器按 字节编址。那么,这个数组的体积是 288 个字节。 答: Volume=m*n*L=(6-1+1)*(7- 0 +1)*6=48*6=288 例:已知二维数组Am,m按行存储的元素地址公式是: Loc(aij)= Loc(a11)+[(i-1)*m+(j-1)]*K , 按列存储的公式是?