数组和广义表
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5
InitArray(&A, n, bound1, ..., boundn) 操作结果:若维数 n 和各维长度合法,
则构造相应的数组A,并 返回OK。
6
DestroyArray(&A) 操作结果:销毁数组A。
7
Value(A, &e, index1, ..., indexn)
初始条件:A是n维数组,e为元素变量, 随后是n 个下标值。
解:LOC(a14)=LOC(a00)+(8×1+4)×6 =1000+72=1072
(4)假设按列存储时,元素a47的第一个 字节的地址; 解:LOC(a47)=LOC(a00)+(6×7+4)×6
=1000+276=1276
15
5.3 矩阵的压缩存储
以常规方法,即以二维数组表示 高阶的稀疏矩阵时产生的问题:
操作结果:若各下标不超界,则e赋值为 所指定的A 的元素值,并返 回OK。
8
Assign(&A, e, index1, ..., indexn)
初始条件:A是n维数组,e为元素变量, 随后是n 个下标值。
操作结果:若下标不超界,则将e的值赋 给所指定的A的元素,并返回 OK。
9
5.2 数组的顺序表示和实现
1) 零值元素占了很大空间; 2) 计算中进行了很多和零值的运算, 遇乘法,白乘;遇除法,还需判别除数
是否为零; 怎样才能解决这些问题16 ?
解决问题的原则:
1) 尽可能少存或不存零值元素;
2) 尽可wk.baidu.com减少没有实际意义的运算;
3) 操作方便; 即: a.能尽可能快地找到与下标值(i,j)
对应的元素; b.能尽可能快地找到同一行或同
a1,0 a1,1 a1,2
L
二维数组A中任一元素ai,j 的存储位置
LOC(i,j) = LOC(0,0) + (b2×i+j)× L
称为基地址或基址。
11
推广到一般情况,可得到 n 维数组数据元 素存储位置的映象关系
n
LOC(j1, j2, ..., jn ) = LOC(0,0,...,0) + ∑i=1ci ji 其中 cn = L,ci-1 = bi ×ci , 1 < i n。
将其3条对角线上的元素存于数组B[3n-2-1] 中,使得B[k] = A[i][j] ,A[i][j]与B[k] 的对应 关系如下(请推导):
k = f(i, j)= ? k=2i+j |i-j|<=1
一列的非零值元; 17
有两类矩阵:
1) 特殊矩阵 值相同的元素或零元素在矩阵中的
分布有一定规率 例如: 三角矩阵 对角矩阵
2) 稀疏矩阵 非零元极少且在矩阵中随机出现
18
特殊矩阵 三角矩阵
k=1+2+…+i+j k=n+(n-1)+…+(n-i)+(j-i)
19
三角矩阵
将A[n][n],把它的非0元按行优先, 逐行、逐个存入 B[n*(n+1)/2]中)
R={R1, R2, ..., Rn}
Ri={<a , a > | j1,... ji,... jn j1, ...ji +1, ...jn 0 jk bk -1, 1 k n 且k i, 0 ji bi -2, i=2,...,n }
基本操作:
} ADT Array
3
二维数组的定义: 数据对象:
配一个存储空间,则可将n2个元素压缩 存储到n(n+1)/2个元的空间中。我们可以 参照下三角以行优先存储。
A[i][j]与B[k] 的对应关系如下:
k=
i*(i+1)/2+j j*(j+1)/2+i
当i>=j ,0<=(i, j)<=n
(下三角)
当i<j, 0<=(i, j)<=n
(上三角)
21
三对角矩阵
称为 n 维数组的映象函数。数组元素 的存储位置是其下标的线性函数
12
课堂练习
• 假设c语言中有二维数组A6×8,每个元素 用相邻的6个字节存储,存储器按字节编 址。已知A的起始存储位置为1000,计算:
(1)数组A的体积(即存储量) (2)数组A的最后一个元素a57的第一个字
节的地址; (3)假设按行存储时,元素a14的第一个字
数组和广义表
5.1 数组的类型定义 5.2 数组的顺序表示和实现 5.3 稀疏矩阵的压缩存储 5.4 广义表的类型定义 5.5 广义表的表示方法 5.6 广义表操作的递归函数
2
5.1 数组的类型定义
ADT Array {
数据对象:
D={a | j1,j2, ...,,ji,jn ji =0,...,bi -1, i=1,2,..,n } 数据关系:
节的地址; (节4)的假地设址按。列存储时,元素a47的第一个字
13
(1)数组A的体积(即存储量) 解:存储量=6×8×6=288
(2)数组A的最后一个元素a57的第一个字 节的地址;
解:LOC( a57 )=1000+288-6=1282
14
(3)假设按行存储时,元素a14的第一个 字节的地址;
①下三角矩阵中有A[i][j]与B[k] 的对应关 系如下:
k= i*(i+1)/2+j
0<=(i,j)<n
②上三角矩阵中有A[i][j]与B[k] 的对应关 系如下:
k=i*(2*n-i+1)/2+j-i 0<=(i,j)<n
20
对称矩阵
满足性质:aij=aji 0<=(i, j)<=n
在存储时我们可以为每一对对称元素分
类型特点: 1) 只有引用型操作,没有加工型操作; 2) 数组是多维的结构,而存储空间是
一个一维的结构。
有两种顺序映象的方式: 1)以行序为主序(低下标优先); 2)以列序为主序(高下标优先);
10
以“行序为主序”的存储映象 例如:
a0,0 a0,1 a0,2
a0,0 a0,1 a0,2 a1,0 a1,1 a1,2
D = {aij | 0≤i≤b1-1, 0 ≤j≤b2-1} 数据关系:
R = { ROW, COL }
ROW = {<ai,j,ai+1,j>| 0≤i≤b1-2, 0≤j≤b2-1} COL = {<ai,j,ai,j+1>| 0≤i≤b1-1, 0≤ j≤b2-2}
4
基本操作:
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。
6
DestroyArray(&A) 操作结果:销毁数组A。
7
Value(A, &e, index1, ..., indexn)
初始条件:A是n维数组,e为元素变量, 随后是n 个下标值。
解:LOC(a14)=LOC(a00)+(8×1+4)×6 =1000+72=1072
(4)假设按列存储时,元素a47的第一个 字节的地址; 解:LOC(a47)=LOC(a00)+(6×7+4)×6
=1000+276=1276
15
5.3 矩阵的压缩存储
以常规方法,即以二维数组表示 高阶的稀疏矩阵时产生的问题:
操作结果:若各下标不超界,则e赋值为 所指定的A 的元素值,并返 回OK。
8
Assign(&A, e, index1, ..., indexn)
初始条件:A是n维数组,e为元素变量, 随后是n 个下标值。
操作结果:若下标不超界,则将e的值赋 给所指定的A的元素,并返回 OK。
9
5.2 数组的顺序表示和实现
1) 零值元素占了很大空间; 2) 计算中进行了很多和零值的运算, 遇乘法,白乘;遇除法,还需判别除数
是否为零; 怎样才能解决这些问题16 ?
解决问题的原则:
1) 尽可能少存或不存零值元素;
2) 尽可wk.baidu.com减少没有实际意义的运算;
3) 操作方便; 即: a.能尽可能快地找到与下标值(i,j)
对应的元素; b.能尽可能快地找到同一行或同
a1,0 a1,1 a1,2
L
二维数组A中任一元素ai,j 的存储位置
LOC(i,j) = LOC(0,0) + (b2×i+j)× L
称为基地址或基址。
11
推广到一般情况,可得到 n 维数组数据元 素存储位置的映象关系
n
LOC(j1, j2, ..., jn ) = LOC(0,0,...,0) + ∑i=1ci ji 其中 cn = L,ci-1 = bi ×ci , 1 < i n。
将其3条对角线上的元素存于数组B[3n-2-1] 中,使得B[k] = A[i][j] ,A[i][j]与B[k] 的对应 关系如下(请推导):
k = f(i, j)= ? k=2i+j |i-j|<=1
一列的非零值元; 17
有两类矩阵:
1) 特殊矩阵 值相同的元素或零元素在矩阵中的
分布有一定规率 例如: 三角矩阵 对角矩阵
2) 稀疏矩阵 非零元极少且在矩阵中随机出现
18
特殊矩阵 三角矩阵
k=1+2+…+i+j k=n+(n-1)+…+(n-i)+(j-i)
19
三角矩阵
将A[n][n],把它的非0元按行优先, 逐行、逐个存入 B[n*(n+1)/2]中)
R={R1, R2, ..., Rn}
Ri={<a , a > | j1,... ji,... jn j1, ...ji +1, ...jn 0 jk bk -1, 1 k n 且k i, 0 ji bi -2, i=2,...,n }
基本操作:
} ADT Array
3
二维数组的定义: 数据对象:
配一个存储空间,则可将n2个元素压缩 存储到n(n+1)/2个元的空间中。我们可以 参照下三角以行优先存储。
A[i][j]与B[k] 的对应关系如下:
k=
i*(i+1)/2+j j*(j+1)/2+i
当i>=j ,0<=(i, j)<=n
(下三角)
当i<j, 0<=(i, j)<=n
(上三角)
21
三对角矩阵
称为 n 维数组的映象函数。数组元素 的存储位置是其下标的线性函数
12
课堂练习
• 假设c语言中有二维数组A6×8,每个元素 用相邻的6个字节存储,存储器按字节编 址。已知A的起始存储位置为1000,计算:
(1)数组A的体积(即存储量) (2)数组A的最后一个元素a57的第一个字
节的地址; (3)假设按行存储时,元素a14的第一个字
数组和广义表
5.1 数组的类型定义 5.2 数组的顺序表示和实现 5.3 稀疏矩阵的压缩存储 5.4 广义表的类型定义 5.5 广义表的表示方法 5.6 广义表操作的递归函数
2
5.1 数组的类型定义
ADT Array {
数据对象:
D={a | j1,j2, ...,,ji,jn ji =0,...,bi -1, i=1,2,..,n } 数据关系:
节的地址; (节4)的假地设址按。列存储时,元素a47的第一个字
13
(1)数组A的体积(即存储量) 解:存储量=6×8×6=288
(2)数组A的最后一个元素a57的第一个字 节的地址;
解:LOC( a57 )=1000+288-6=1282
14
(3)假设按行存储时,元素a14的第一个 字节的地址;
①下三角矩阵中有A[i][j]与B[k] 的对应关 系如下:
k= i*(i+1)/2+j
0<=(i,j)<n
②上三角矩阵中有A[i][j]与B[k] 的对应关 系如下:
k=i*(2*n-i+1)/2+j-i 0<=(i,j)<n
20
对称矩阵
满足性质:aij=aji 0<=(i, j)<=n
在存储时我们可以为每一对对称元素分
类型特点: 1) 只有引用型操作,没有加工型操作; 2) 数组是多维的结构,而存储空间是
一个一维的结构。
有两种顺序映象的方式: 1)以行序为主序(低下标优先); 2)以列序为主序(高下标优先);
10
以“行序为主序”的存储映象 例如:
a0,0 a0,1 a0,2
a0,0 a0,1 a0,2 a1,0 a1,1 a1,2
D = {aij | 0≤i≤b1-1, 0 ≤j≤b2-1} 数据关系:
R = { ROW, COL }
ROW = {<ai,j,ai+1,j>| 0≤i≤b1-2, 0≤j≤b2-1} COL = {<ai,j,ai,j+1>| 0≤i≤b1-1, 0≤ j≤b2-2}
4
基本操作:
InitArray(&A, n, bound1, ..., boundn) DestroyArray(&A) Value(A, &e, index1, ..., indexn) Assign(&A, e, index1, ..., indexn)