数据结构第五章数组和广义表
合集下载
数据结构第五章 数组与广义表
an-1,n-1
压缩存储方法:只需要存储下三角 (含对角线)上的元素。可节省一 半空间。
可以使用一维数组Sa[n(n+1)/2]作为n阶对称矩阵A的存 储结构,且约定以行序为主序存储各个元素,则在Sa[k]和矩
阵元素aij之间存在一一对应关系: (下标变换公式)
i(i+1)/2 + j 当i≥j k = j(j+1)/2 + i 当i<j
q = cpot[col];
T.data[q].i = M.data[p].j; T.data[q].j = M.data[p].i; T.data[q].e = M.data[p].e; ++cpot[col]; }
分析算法FastTransposeSMatrix的时间 复杂度:
for (col=1; col<=M.nu; ++col) … … for (t=1; t<=M.tu; ++t) … … for (col=2; col<=M.nu; ++col) … … for (p=1; p<=M.tu; ++p) … …
//对当前行中每一个非零元
处
brow=M.data[p].j;
理
if (brow < N.nu ) t = N.rpos[brow+1];
M
else { t = N.tu+1 }
的
for (q=N.rpos[brow]; q< t; ++q) { ccol = N.data[q].j; // 乘积元素在Q中列号
一、三元组顺序表
对于稀疏矩阵,非零元可以用三元组表示, 整个稀疏矩阵可以表示为所有非零元的三元组所 构成的线性表。例如:
压缩存储方法:只需要存储下三角 (含对角线)上的元素。可节省一 半空间。
可以使用一维数组Sa[n(n+1)/2]作为n阶对称矩阵A的存 储结构,且约定以行序为主序存储各个元素,则在Sa[k]和矩
阵元素aij之间存在一一对应关系: (下标变换公式)
i(i+1)/2 + j 当i≥j k = j(j+1)/2 + i 当i<j
q = cpot[col];
T.data[q].i = M.data[p].j; T.data[q].j = M.data[p].i; T.data[q].e = M.data[p].e; ++cpot[col]; }
分析算法FastTransposeSMatrix的时间 复杂度:
for (col=1; col<=M.nu; ++col) … … for (t=1; t<=M.tu; ++t) … … for (col=2; col<=M.nu; ++col) … … for (p=1; p<=M.tu; ++p) … …
//对当前行中每一个非零元
处
brow=M.data[p].j;
理
if (brow < N.nu ) t = N.rpos[brow+1];
M
else { t = N.tu+1 }
的
for (q=N.rpos[brow]; q< t; ++q) { ccol = N.data[q].j; // 乘积元素在Q中列号
一、三元组顺序表
对于稀疏矩阵,非零元可以用三元组表示, 整个稀疏矩阵可以表示为所有非零元的三元组所 构成的线性表。例如:
数据结构-第五章 数组与广义表-文档资料
上 三 角 矩 阵 下 三 角 矩 阵
a00 a10 a 20 an10
0 1 2
a01 a11 a21 an11
3 4
a02 a12 a22 an12
5
6 7
a0 n1 a1n1 a2 n1 an1n1
行 列 值 (row) (col) (value) 0 4 91 1 1 11 2 5 28 3 0 22 3 2 -6 5 1 17 5 3 39 6 0 16
用三元组表表示的稀疏矩阵及其转置
行 列 值 (row) (col) (value) 0 3 22 0 6 15 1 1 11 1 5 17 2 3 -6 3 5 39 4 0 91 5 2 28 行 列 值 (row) (col) (value) 0 4 91 1 1 11 2 5 28 3 0 22 3 2 -6 5 1 17 5 3 39 6 0 16
4 5 6 7 8 9 10
B a00 a01 a10 a11 a12 a21 a22 a23 … an-1n-2 an-1n-1
三对角矩阵中除主对角线及在主对角线上 下最临 近的两条对角线上的元素外,所有其它元素均为 0。总共有3n-2个非零元素。 将三对角矩阵A中三条对角线上的元素按行存放在 一维数组 B 中,且a00存放于B[0]。 在三条对角线上的元素aij 满足 0 i n-1, i-1 j i+1 在一维数组 B 中 A[i][j] 在第 i 行,它前面有 3*i-1 个非零元素, 在本行中第 j 列前面有 j-i+1 个,所 以元素 A[i][j] 在 B 中位置为 k = 2*i + j。
三对角矩阵的压缩存储
数据结构第5章数组和广义表数组ppt课件
if (!A.base) return ERROR;
数组基址指针
free(A.base); A.base = NULL; if !(A.bounds) return ERROR;
free(A.bounds); A.bounds=NULL;
各维长度保 存区指针 映保像存函区数指针ci
if !(A.constants) return ERROR; free(A.constants); A.constants=NULL; }
…
………………….
a2n
…
am1 am2 …….. amn
am1
am2
…
amn
§5.2 数组的顺序表示和实现
❖按列优先顺序存放
a11 a21
…
a11 a12 …….. a1n
am1 a12
a21 a22 …….. a2n
a22
…
………………….
am2
am1 am2 …….. amn
… a1n
a2n
一个n维数组可以看成是由若干个n-1维数组组成 的线性表。
§5.1 数组的定义
❖数组的抽象数据类型定义
ADT Array { 数据对象:D={aj1j2…jn | ji=0,…,bi-1, i=1,2,…,n,n(>0)称为数组
的维数,bi是数组第i维的长度,ji是数组元素的第i维下标, aj1…jn∈ElemSet } 数据关系: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, aj1…ji…jn , aj1…ji+1…jn∈D, i=1,2,…,n 基本操作:
《数据结构——用C语言描述(第二版)》第5章 数组和广义表
是指矩阵的下三角(不含对角线)中的元素均为常数C或零的n阶矩阵,下 三角矩阵则与之相反,如图5.3所示。
第五章 数组和广义表
在压缩存储时,矩阵中值相同的元素C可共享一个存储空间,元素 为零则可不必分配空间,而其余的元素有 n(n+1)/2个,因此三角矩阵 可用一维数组M[n×(n+1)/2+1]来存储,其中常数C放在数组的最后一 个下标变量中。
假设A和B矩阵分别用matrix型指针变量a和b表示,矩阵的转置可以 按以下进行:由于B的行是A的列,所以可按照b->data三元组表的次序在 a->data中找到相应的三元组进行转置,即可按a->data的列序转置,所得 到的转置矩阵B的三元组表b->data必定是按行优先存放的。因此,可以对 三元组表a->data从第一行起扫描,找到A的每一列中所有的非零元素,就 可以实现转置。
LOC ( aij ) =LOC ( a00) +(i×n+j) × c 同理可推导出以列为主序优先存储时数据元素a i j 的存储地址,其计算公式 为:
LOC( a i j ) =LOC( a00 ) +( j × n +i ) × c 对于三维数组Am×n×p而言,若以行为主序优先存储时,则其数据元 素aijk的存储地址可为: LOC ( a i j k) =LOC ( a000) +[ i × m×p +j ×p +k] × c 对于一般的二维数组A[c1…d1,c2…d2]而言,此处c1,c2的值不一定是 0,a i j 的地址为: LOC ( a i j ) =LOC ( a c 1 c 2 ) +[ ( i – c 1 )* ( d 2 – c 2 +1) +j – c 2 ] * c
第五章 数组和广义表
在压缩存储时,矩阵中值相同的元素C可共享一个存储空间,元素 为零则可不必分配空间,而其余的元素有 n(n+1)/2个,因此三角矩阵 可用一维数组M[n×(n+1)/2+1]来存储,其中常数C放在数组的最后一 个下标变量中。
假设A和B矩阵分别用matrix型指针变量a和b表示,矩阵的转置可以 按以下进行:由于B的行是A的列,所以可按照b->data三元组表的次序在 a->data中找到相应的三元组进行转置,即可按a->data的列序转置,所得 到的转置矩阵B的三元组表b->data必定是按行优先存放的。因此,可以对 三元组表a->data从第一行起扫描,找到A的每一列中所有的非零元素,就 可以实现转置。
LOC ( aij ) =LOC ( a00) +(i×n+j) × c 同理可推导出以列为主序优先存储时数据元素a i j 的存储地址,其计算公式 为:
LOC( a i j ) =LOC( a00 ) +( j × n +i ) × c 对于三维数组Am×n×p而言,若以行为主序优先存储时,则其数据元 素aijk的存储地址可为: LOC ( a i j k) =LOC ( a000) +[ i × m×p +j ×p +k] × c 对于一般的二维数组A[c1…d1,c2…d2]而言,此处c1,c2的值不一定是 0,a i j 的地址为: LOC ( a i j ) =LOC ( a c 1 c 2 ) +[ ( i – c 1 )* ( d 2 – c 2 +1) +j – c 2 ] * c
数据结构课件-DS05-数组与广义表.ppt
若i > j,数组元素A[i][j]在矩阵的下三角部分,在 数组 B 中没有存放。因此,找它的对称元素A[j][i]。
的 i, 此即为该元素的行号。 j = k - i * (i + 1) / 2
此即为该元素的列号。 例,当 k = 8, 3*4 / 2 = 6 k < 4*5 / 2 =10,
取 i = 3。则 j = 8 - 3*4 / 2 = 2。
第 章 数组和广义表
a00 a01 a02 a03 上
n=4
第 章 数组和广义表
第五章 数组
数组的类型定义和表示方法 特殊矩阵和稀疏矩阵存储方法
及运算的实现 广义表的结构特点
第 章 数组和广义表
数组可以看成是一种特殊的线性表,即线性表 中数据元素本身也是一个线性表
5.1.1 二维数组的定义
定义
)
)
)
(a11 a12 ... ... a1n)
)
)
Amn
(a21
n1
n
aj1ij kj1mk in*l
第 章 数组和广义表
5.2.1 特殊矩阵
为节约存储,只存对角线及对角线以上的元素, 或者只存对角线及对角线以下的元素。前者称为 上三角矩阵,后者称为下三角矩阵。
a00 a01 a02 a0n1
aaan121000
a11
a21 an11
a12
a22 an12
数据元素同构
数组运算
给定一组下标,存取相应的数据元素
给定一组下标,修改数据元素的值
第 章 数组和广义表
矩阵Am×n看成n个列向量的线性表
第 章 数组和广义表
矩阵Am×n看成m个行向量的线性表
第 章 数组和广义表
的 i, 此即为该元素的行号。 j = k - i * (i + 1) / 2
此即为该元素的列号。 例,当 k = 8, 3*4 / 2 = 6 k < 4*5 / 2 =10,
取 i = 3。则 j = 8 - 3*4 / 2 = 2。
第 章 数组和广义表
a00 a01 a02 a03 上
n=4
第 章 数组和广义表
第五章 数组
数组的类型定义和表示方法 特殊矩阵和稀疏矩阵存储方法
及运算的实现 广义表的结构特点
第 章 数组和广义表
数组可以看成是一种特殊的线性表,即线性表 中数据元素本身也是一个线性表
5.1.1 二维数组的定义
定义
)
)
)
(a11 a12 ... ... a1n)
)
)
Amn
(a21
n1
n
aj1ij kj1mk in*l
第 章 数组和广义表
5.2.1 特殊矩阵
为节约存储,只存对角线及对角线以上的元素, 或者只存对角线及对角线以下的元素。前者称为 上三角矩阵,后者称为下三角矩阵。
a00 a01 a02 a0n1
aaan121000
a11
a21 an11
a12
a22 an12
数据元素同构
数组运算
给定一组下标,存取相应的数据元素
给定一组下标,修改数据元素的值
第 章 数组和广义表
矩阵Am×n看成n个列向量的线性表
第 章 数组和广义表
矩阵Am×n看成m个行向量的线性表
第 章 数组和广义表
数据结构第五章
5.3.1 特殊矩阵
是指非零元素或零元素的分布有一定规律的矩阵。
1、对称矩阵 在一个n阶方阵A中,若元素满足下述性质: aij = aji 0≦i,j≦n-1 则称A为对称矩阵。
对称矩阵中的元素关于主对角线对称,故只 要存储矩阵中上三角或下三角中的元素,这样, 能节约近一半的存储空间。
2013-7-25 第4章 18
5.3 矩阵的压缩存储
在科学与工程计算问题中,矩阵是一种常用 的数学对象,在高级语言编制程序时,常将 一个矩阵描述为一个二维数组。 当矩阵中的非零元素呈某种规律分布或者矩 阵中出现大量的零元素的情况下,会占用许 多单元去存储重复的非零元素或零元素,这 对高阶矩阵会造成极大的浪费。 为了节省存储空间,我们可以对这类矩阵进 行压缩存储:
5.2 数组的顺序表示和实现 由于计算机的内存结构是一维的, 因此用一维内存来表示多维数组,就必 须按某种次序将数组元素排成一列序列 ,然后将这个线性序列存放在存储器中 。 又由于对数组一般不做插入和删除 操作,也就是说,数组一旦建立,结构 中的元素个数和元素间的关系就不再发 生变化。因此,一般都是采用顺序存储 的方法来表示数组。
即为多个相同的非零元素只分配一个存储空间; 对零元素不分配空间。
课堂讨论: 1. 什么是压缩存储? 若多个数据元素的值都相同,则只分配一个元素值的 存储空间,且零元素不占存储空间。 2. 所有二维数组(矩阵)都能压缩吗? 未必,要看矩阵是否具备以上压缩条件。 3. 什么样的矩阵具备以上压缩条件? 一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵, 稀疏矩阵等。 4. 什么叫稀疏矩阵? 矩阵中非零元素的个数较少(一般小于5%)
通常有两种顺序存储方式:
⑴行优先顺序——将数组元素按行排列,第i+1个行 向量紧接在第i个行向量后面。以二维数组为例,按 行优先顺序存储的线性序列为: a11,a12,…,a1n,a21,a22,…a2n,……,am1,am2,…,amn 在PASCAL、C语言中,数组就是按行优先顺序存 储的。 ⑵列优先顺序——将数组元素按列向量排列,第j+1 个列向量紧接在第j个列向量之后,A的m*n个元素按 列优先顺序存储的线性序列为: a11,a21,…,am1,a12,a22,…am2,……,an1,an2,…,anm 在FORTRAN语言中,数组就是按列优先顺序存储的。
数据结构之数组与广义表课件PPT课件
对称矩阵有n*n个元素,但只存储n*(n+1)/2 个元素即可. 若以行序为主序,把下三角中的 元素,存储在一个一维数组SA[n*(n+1)/2] 中, 则 A[i,j] 和SA[k] 的对应关系如下:
若 i>=j , 则A[i, j]在下三角中,A[i, j]之前共有 1+2+……+i+j = i*(i+1)/2+j 个元素,因此有
2
3 -1
3
1
-1
6
4
5
2
8
6
1
5
7
6
9
7 7 7
t: 1 3 -1
165 212 258 3 1 -1 634 679
➢ 基本思想:
把S转置成T,就是把S中的每一个三元组的 行号和列号(row 和col)交换,并存储在T 中。但是,这样的结果是按列优先存储的稀 疏矩阵T,所以,还必须重新排列三元组的 顺序。
3.稀疏矩阵的压缩存储
➢ 若一个m*n矩阵,有s个非0元素, 记 e=s/(m*n) e 称为稀疏因子。 当 e0.05时,则称为稀疏矩阵。
例: M=
0 2 -1 0 0 0 0 0000000 -1 0 0 0 0 4 0 0000000 0800000 5000000 0000090
➢ 在稀疏矩阵中,非0元素的排列无规律,所以不 能采用以前的压缩方法。
1. 一维数组的寻址公式
对于一维数组,若其第一个元素的首地
址为Loc(a0),下标为 i 的数组元素A[i]的地
址为Loc(ai),
a a 则 Loc( i) = Loc( 0) + k * i
( 0≤i≤n-1)
数据结构课件PPT数组和广义表
T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; if (T.tu)
{ q=1; for (col=1;col<=T.mu;++col) for(p=1;p<=M.tu;++p) if ( M.data[p].j==col ) { T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++q; } }
(row) (col) (value)
[0] 1 4 22
[0] 1 5 91
[1] 1 7 15
[1] 2 2 11
[2] 2 2 11
[2] 3 6 28
[3] 2 [4] 3来自6 17 4 -6[3] 4 [4] 4
1 22 3 -6
[5] 4 6 39
[5] 6 2 17
[6] 5 1 91
[6] 6 4 39
cpot[1]=1 cpot[col]=cpot[col-1]+num[col-1]
稀疏矩阵的快速转置(算法5.2)
Status FastTransposeSMatrix(TSMatrix M,TSMatrix &T) { T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
if (T.tu) { for (col=1;col<=M.nu;++col) num[col]=0; for (t=1;t<=M.tu;++t) ++num[M.data[t].j]; cpot[1]=1; for ( col=2;col<=M.nu;++col) cpot[col]=cpot[col-1]+num[col-1]; for (p=1;p<=M.Tu;++p) { col=M.data[p].j; q=cpot[col]; T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++cpot[col]; } }
{ q=1; for (col=1;col<=T.mu;++col) for(p=1;p<=M.tu;++p) if ( M.data[p].j==col ) { T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++q; } }
(row) (col) (value)
[0] 1 4 22
[0] 1 5 91
[1] 1 7 15
[1] 2 2 11
[2] 2 2 11
[2] 3 6 28
[3] 2 [4] 3来自6 17 4 -6[3] 4 [4] 4
1 22 3 -6
[5] 4 6 39
[5] 6 2 17
[6] 5 1 91
[6] 6 4 39
cpot[1]=1 cpot[col]=cpot[col-1]+num[col-1]
稀疏矩阵的快速转置(算法5.2)
Status FastTransposeSMatrix(TSMatrix M,TSMatrix &T) { T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
if (T.tu) { for (col=1;col<=M.nu;++col) num[col]=0; for (t=1;t<=M.tu;++t) ++num[M.data[t].j]; cpot[1]=1; for ( col=2;col<=M.nu;++col) cpot[col]=cpot[col-1]+num[col-1]; for (p=1;p<=M.Tu;++p) { col=M.data[p].j; q=cpot[col]; T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++cpot[col]; } }
数据结构(C)严蔚敏(数组与广义表)PPT课件
a00
Am×n
=
a10 ...
am-1,0
a01 a11 ...
am-1,1
a02 a12 ...
am-1,2
... a0,n-1
...
a1,n-1
... ...
... am-1,n-1
Data Structure
03.12.2020
Page 5
按行序为主序存放
0
1
n-1
Am×n
=
a00 a10 ...
a00
Am×n
=
a10 ...
am-1,0
a01 a11 ...
am-1,1
a02 a12 ...
am-1,2
... a0,n-1
...
a1,n-1
... ...
... am-1,n-1
列向量
a00
Am×n
=
a10 ...
am-1,0
a01 a11 ...
am-1,1
a02 a12 ...
初始条件:A 是 n 维数组,e 为元素变量,随后是 n 个下标值。 操作结果:若各下标不超界,则e赋值为所指定的A的元素值,并返回OK。
Assign(&A, e, index1, ..., indexn)
初始条件:A 是 n 维数组,e 为元素变量,随后是 n 个下标值。 操作结果:若下标不超界,则将 e 的值赋给A中指定下标的元素。
a00 a10 ……. am-1,1 a01 a11 …….. am-1,1 ………. a0,n-1 a1,n-1 …….. am-1 ,n-1
Page 7
按行序为主序存放
0
Am×n
数据结构数组和广义表
数据结构05数组与广义表数组与广义表可以看做是线性表地扩展,即数组与广义表地数据元素本身也是一种数据结构。
5.1 数组地基本概念5.2 数组地存储结构5.3 矩阵地压缩存储5.4 广义表地基本概念数组是由相同类型地一组数据元素组成地一个有限序列。
其数据元素通常也称为数组元素。
数组地每个数据元素都有一个序号,称为下标。
可以通过数组下标访问数据元素。
数据元素受n(n≥1)个线性关系地约束,每个数据元素在n个线性关系地序号 i1,i2,…,in称为该数据元素地下标,并称该数组为n维数组。
如下图是一个m行,n列地二维数组A矩阵任何一个元素都有两个下标,一个为行号,另一个为列号。
如aij表示第i行j列地数据元素。
数组也是一种线性数据结构,它可以看成是线性表地一种扩充。
一维数组可以看作是一个线性表,二维数组可以看作数据元素是一维数组(或线性表)地线性表,其一行或一列就是一个一维数组地数据元素。
如上例地二维数组既可表示成一个行向量地线性表: A1=(a11,a12,···,a1n)A2=(a21,a22, ···,a2n)A=(A1,A2, ···,Am) ············Am=(am1,am2, ···,amn)也可表示成一个列向量地线性表:B1=(a11,a21,···,am1)B2=(a12,a22, ···,am2)A=(B1,B2, ···,Bm) ············Bn=(a1n,a2n, ···,amn)数组地每个数据元素都与一组唯一地下标值对应。
第5章 数组和广义表总结
0603
2090
B5×4 = 0 8 0 0
0000
row col val
4000
0 12
0 44
1 06
1 28
2 19
3 03
现在,要通过A的 三元组表求其转置 矩阵B的三元组表。
row col val
0 16 0 33 1 02 1 29 2 18 4 04
16
三元组表的转置
方法1:设矩阵A是m行、n列、t个非0元素 从头到尾扫描A,将第0列的元素依次放入B(行号列号互换); 从头到尾扫描A,将第1列的元素依次放入B(行号列号互换); ...... 从头到尾扫描A,将第n-1列的元素依次放入B(行号列号互换); 扫描A几趟? 矩阵A的列数n
}tritype;
typedef struct { //三元组表
tritype data[MAXSIZE]; //三元组表存储空间
int mu, nu, tu;
//原矩阵的行数、列数、非0元素个数
}Tsmtype, *Tsmlink;
//三元组表说明符
14
三元组表
例 5.3 矩阵的转置。 求矩阵A的转置矩阵B,算法很简单:
ArrayInit(&A, n, d1, d2, ..., dn) ArrayDestroy(&A)
ArrayGet(A, i1, ..., in, &e)
ArrayAssign(&A, i1, ..., in, e) }ADT Array;
数组的基本操作一般不包括插入和删除
4
5.2 数组的存储结构
存储空间是在程序执行时动态分配的
n维数组A[u1][u2]…[un]
数据结构第五章 数组和广义表
5.3.1
特殊矩阵
1、对称矩阵 在一个n阶方阵A中,若元素满足下述性质: aij = aji 1≤i,j≤n 则称A为对称矩阵。 a11 1 5 1 3 7 a21 a 22 5 0 8 0 0 a31 a32 a33 1 8 9 2 6 ……………….. 3 0 2 5 1 an 1 a n 2 a n 3 …a n n 7 0 6 1 3
第5章
数组和广义表
5.1 数组的定义
5.2 数组的顺序表示和实现
5.3 矩阵的压缩存储
5.3.1 特殊矩阵
5.3.2 稀疏矩阵
5.4 广义表的定义
5.1 数组的定义
数组-----线性表的扩展 A =(a0,a1,a2,…,an-1)
a00 a10 ┇ Am×n= ai0 ┇ am-1,0 a01 … a0j … a11 … a1j … ┇ ai2 … aij … ┇ am-1,2 … am-1,j … a0,n-1 a1,n-1 ai,n-1 am-1,n-1 α0 α1 ┇ Am×n= α i ┇ α m-1
Assign( &A, e, index1, ..., indexn) 赋值操作 初始条件:A是n维数组,e为元素变量,随后是n个下标值。 操作结果:若下标不超界,则将e的值赋给所指定的A的元 素,并返回OK。 对于数组来说一旦维数确定了,每个元素的下标确定了, 那么整个数组就确定了,这样的一个数组结构除了能改变 某元素的值,其他的不能再改变。
5.2 数组的顺序表示和实现
数组类型特点: 1) 只有引用型操作,没有加工型操作; 2) 数组是多维的结构,而存储空间是一个一维的结构。 有两种顺序映象的方式。
有两种顺序映像方法: 1)以行序为主序(行优先,先行后列):先存储行号较小 的元素,行号相同者先存储列号较小的元素;
数据结构 第五章 数组和广义表
则行优先存储时的地址公式为: LOC(aij)=LOC(ac1,c2)+[(i-c1)*(d2-c2+1)+j-c2)]*L
数组基址
aij之前的行
数
总列数,即 第2维长度
aij本行前面
的元素个数
单个元素 长度
例2一个二维数组A,行下标的范围是1到6,列下标的范围是0
到7,每个数组元素用相邻的6个字节存储,存储器按字节编址。 288 个字节。 那么,这个数组的体积是
2.若对n阶对称矩阵A以行序为主序方式将其下三 角形的元素(包括主对角线上所有元素)依次存 放于一维数组B[1..(n(n+1))/2]中,则在B 中确定aij(i<j)的位置k的关系为( )。 A. i*(i-1)/2+j B. j*(j-1)/2+i C. i*(i+1)/2+j D. j*(j+1)/2+i
维界虽未变,但此时的a[32,58]不 再是原来的a[32,58]
例5:假设有三维数组A7×9×8,每个元素用相邻的6个字节存
储,存储器按字节编址。已知A的起始存储位置(基地址)为 1000,末尾元素A[6][8][7]的第一个字节地址为多少?若按 高地址优先存储时,元素A[4][7][6]的第一个字节地址为多 少? 答: 末尾元素A[6][8][7]的第1个字节地址= 1000 +(9*8*6+8*8+7)*6=4018 提示:将第1维看作“页码”,后面两维就是每页上的二维数组 。 计算地址 的意义: 只要计算出任一数组元素的地址,就 能对其轻松地进行读写操作!
4.已知数组A[0..9,0..9]的每个元素占5个存储 单元,将其按行优先次序存储在起始地址为 1000的连续的内存单元中,则元素A[6,8]的 地址为_________
数据结构讲义第5章-数组和广义表
对于一个矩阵结构,显然用一个二维数组来表示是非常 恰当的.但有时会遇到这样一类矩阵:在这种矩阵中有 许多值相同的元素或者是零元素,为了节省存储空间, 可以对这类矩阵进行压缩存储. 压缩存储是:为多个值相同的元素只分配一个存储空间: 对零元素不分配存储空间. 特殊矩阵:值相同的元素或者零元素在矩阵中的分布有 一定规律,则称此类矩阵为特殊矩阵,反之,称为稀疏 矩阵.
5.4 广义表
5)若广义表不空,则可分成表头和表尾,反之,一对表头和表尾 可唯一确定广义表 对非空广义表:称第一个元素为L的表头,其余元素组成的表称 为LS的表尾; B = (a,(b,c,d)) 表头:a 表尾 ((b,c,d)) 即 HEAD(B)=a, C = (e) D = (A,B,C,f ) 表头:e 表尾 ( ) TAIL(B)=((b,c,d)),
5.4 广义表
4)下面是一些广义表的例子; A = ( ) 空表,表长为0; B = (a,(b,c,d)) B的表长为2,两个元素分别为 a 和子表(b,c,d); C = (e) C中只有一个元素e,表长为1; D = (A,B,C,f ) D 的表长为4,它的前三个元素 A B C 广义表, 4 A,B,C , 第四个是单元素; E=( a ,E ) 递归表.
以二维数组为例:二维数组中的每个元素都受两个线性关 系的约束即行关系和列关系,在每个关系中,每个元素aij 都有且仅有一个直接前趋,都有且仅有一个直接后继. 在行关系中 aij直接前趋是 aij直接后继是 在列关系中 aij直接前趋是 aij直接后继是
a00 a01 a10 a11
a0 n-1 a1 n-1
a11 a21 ┇ a12 a22 ┇ ai2 ┇ … amj … amn … aij … ain … … a1j a2j … … a1n a2n β1 β2 ┇ βi ┇ βm
5.4 广义表
5)若广义表不空,则可分成表头和表尾,反之,一对表头和表尾 可唯一确定广义表 对非空广义表:称第一个元素为L的表头,其余元素组成的表称 为LS的表尾; B = (a,(b,c,d)) 表头:a 表尾 ((b,c,d)) 即 HEAD(B)=a, C = (e) D = (A,B,C,f ) 表头:e 表尾 ( ) TAIL(B)=((b,c,d)),
5.4 广义表
4)下面是一些广义表的例子; A = ( ) 空表,表长为0; B = (a,(b,c,d)) B的表长为2,两个元素分别为 a 和子表(b,c,d); C = (e) C中只有一个元素e,表长为1; D = (A,B,C,f ) D 的表长为4,它的前三个元素 A B C 广义表, 4 A,B,C , 第四个是单元素; E=( a ,E ) 递归表.
以二维数组为例:二维数组中的每个元素都受两个线性关 系的约束即行关系和列关系,在每个关系中,每个元素aij 都有且仅有一个直接前趋,都有且仅有一个直接后继. 在行关系中 aij直接前趋是 aij直接后继是 在列关系中 aij直接前趋是 aij直接后继是
a00 a01 a10 a11
a0 n-1 a1 n-1
a11 a21 ┇ a12 a22 ┇ ai2 ┇ … amj … amn … aij … ain … … a1j a2j … … a1n a2n β1 β2 ┇ βi ┇ βm
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Loc[i,j]=Loc[1,1]+n×(i-1)+(j-1) 如果每个元素占size个存储单元 ,则任意元素aij 的地址计算公式为:
Loc[i,j]=Loc[1,1] + (n×(i-1)+j-1)×size
数据结构第五章数组和广义表
三维数组A(1..r , 1..m , 1..n)可以看成是r个m×n的 二维数组 ,如下图所示:
数据结构第五章数组和广义表
假定每个元素占一个存储单元,采用以行为主序 的方法存放 ,首元素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。
数据结构第五章数组和广义表
数组的抽象数据类型定义(ADT Array) 数据对象:D={ aj1j2…jn| n>0,称为数组的维数,ji是 数组的第i维下标,1≤ji≤bi,bi为数组第i维的长度, aj1j2…jn ∈ElementSet} 数据关系:R={R1,R2,…,Rn} Ri={< aj1 … ji…jn ,aj1 … ji+1…jn > | 1≤jk≤bk,1≤k≤n 且 k≠i,1≤ji≤bi-1, aj1 … ji…jn ,aj1 … ji+1…jn ∈D, i=1,…,n}
amj
… amn
m
数据结构第五章数组和广义表
上面二维数组的例子,介绍了数组的结构特性,实 际上数组是一组有固定个数的元素的集合。由于这 个性质,使得对数组的操作不象对线性表的操作那 样,可以在表中任意一个合法的位置插入或删除一 个元素。 对于数组的操作一般只有两类: (1)获得特定位置的元素值; (2)修改特定位置的元素值。
A=( 1 2 ┅ j ┅ n)
Am×n=
a12 a12 ┅
a1j
┅ a1n
a21 a22 ┅
a2j
┅ a2n
┇┇
ai1 ai2 ┅
aij
┇┇
┅ ain
am1 am2 ┅
amj
┅ amn
矩阵Am×n看成n个列向量的线性表,即j=(a1j,a2j, …,amj)
数据结构第五章数组和广义表
我们还可以将数组Am×n看成另外一个线性表:
数组的顺序存储结构有两种:一种是按行序存 储,如高级语言BASIC、COBOL和PASCAL语言都 是以行序为主。另一种是按列序存储,如高级语言中 的FORTRAN语言就是以列序为主。
数据结构第五章数组和广义表
对于二维数组Amxn
以 行 为 主 的 存 储 序 列 为 : a11 ,a12, … a1n ,a21 ,a22 ,…,a2n , … … ,am1 ,am2 , …, amn
+1*(d3-c3+1)*(j2-c2)+1*(j3-c3) 其中l为每个元素所占存储单元数。
数据结构第五章数组和广义表
令α1=1*(d2-c2+1)*(d3-c3+1), α2=1*(d3-c3+1), α3=1,则:
பைடு நூலகம்
以 列 为 主 存 储 序 列 为 : a11, am1 ,a12 ,a22 ,… ,am2 ,… … ,a1n ,a2n , … ,amn
a21,…
假设有一个3×4×2的三维数组A ,其逻辑结构图为:
纵
列 行
数据结构第五章数组和广义表
以二维数组Amn为例,假设每个元素只占一个存 储单元,“以行为主”存放数组,下标从1开始,首元 素a11的地址为Loc[1,1] 求任意元素aij的地址 ,可由如 下计算公式得到:
注意:这里定义的数组下标是从1开始,与C语言的 数组略有不同。
数据结构第五章数组和广义表
5.2 数组的顺序存储和实现
对于数组A,一旦给定其维数n及各维长度bi (1≤i≤n),则该数组中元素的个数是固定的,不可 以对数组做插入和删除操作,不涉及移动元素操作, 因此对于数组而言,采用顺序存储法比较合适。
Am×n=
a12 a12 ┅
a1j
┅ a1n
a21 a22 ┅
a2j
┅ a2n
┇┇
ai1 ai2 ┅
aij
┇┇
┅ ain
am1 am2 ┅
amj
┅ amn
数据结构第五章数组和广义表
我们可以把二维数组看成一个线性表: A=( 1 2 … j … n),其中j(1≤j ≤n)本身也 是一个线性表,称为列向量。
B=(1,,2,,… ,m),其中i(1≤i ≤m)本身也是一个线性表, 称为行向量,即: I= (ai1,ai2, …,aij ,…,ain)。
B ‖
a12 a12 …
a1j
… a1n
1
a21 a22 … a2j
… a2n
2
┇┇
┇
Am×n=
ai1 ai2 … aij
… ain
i
┇┇
┇
am1 am2 …
第5章 数组和广义表
5.1 数组的定义和运算
5.2 数组的顺序存储和实现
5.3 特殊矩阵的压缩存储
5.3.1 三角矩阵
5.3.2 带状矩阵
5.3.3 稀疏矩阵
5.4 广义表
数据结构第五章数组和广义表
5.1 数组的定义和运算
数组是一种数据类型。从逻辑结构上看,数组可以 看成是一般线性表的扩充。二维数组可以看成是线 性表的线性表。例如:
数据结构第五章数组和广义表
基本操作:
(1)InitArray(A,n,bound1,…,boundn): 若维数n和各维的长 度合法,则构造相应的数组A,并返回TRUE; (2)DestroyArray(A): 销毁数组A; (3)GetValue(A,e, index1, …,indexn): 若下标合法, 用e返回数组A中由index1, …,indexn所指定的元素的值。 (4)SetValue(A,e,index1, …,indexn): 若下标合法, 则将数组A中由index1, …,indexn所指定的元素的值置为e。
数据结构第五章数组和广义表
如果将三维数组推广到一般情况,即:用j1,j2, j3代替数组下标i,j,k;并且j1,j2,j3的下限为c1, c2,c3,上限分别为d1,d2,d3,每个元素占一个存 储单元。则三维数组中任意元素a(j1,j2,j3)的地址 为:
Loc[j1,j2,j3]=Loc[c1,c2,c3]+1*(d2-c2+1)*(d3-c3+1)*(j1-c1)
Loc[i,j]=Loc[1,1] + (n×(i-1)+j-1)×size
数据结构第五章数组和广义表
三维数组A(1..r , 1..m , 1..n)可以看成是r个m×n的 二维数组 ,如下图所示:
数据结构第五章数组和广义表
假定每个元素占一个存储单元,采用以行为主序 的方法存放 ,首元素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。
数据结构第五章数组和广义表
数组的抽象数据类型定义(ADT Array) 数据对象:D={ aj1j2…jn| n>0,称为数组的维数,ji是 数组的第i维下标,1≤ji≤bi,bi为数组第i维的长度, aj1j2…jn ∈ElementSet} 数据关系:R={R1,R2,…,Rn} Ri={< aj1 … ji…jn ,aj1 … ji+1…jn > | 1≤jk≤bk,1≤k≤n 且 k≠i,1≤ji≤bi-1, aj1 … ji…jn ,aj1 … ji+1…jn ∈D, i=1,…,n}
amj
… amn
m
数据结构第五章数组和广义表
上面二维数组的例子,介绍了数组的结构特性,实 际上数组是一组有固定个数的元素的集合。由于这 个性质,使得对数组的操作不象对线性表的操作那 样,可以在表中任意一个合法的位置插入或删除一 个元素。 对于数组的操作一般只有两类: (1)获得特定位置的元素值; (2)修改特定位置的元素值。
A=( 1 2 ┅ j ┅ n)
Am×n=
a12 a12 ┅
a1j
┅ a1n
a21 a22 ┅
a2j
┅ a2n
┇┇
ai1 ai2 ┅
aij
┇┇
┅ ain
am1 am2 ┅
amj
┅ amn
矩阵Am×n看成n个列向量的线性表,即j=(a1j,a2j, …,amj)
数据结构第五章数组和广义表
我们还可以将数组Am×n看成另外一个线性表:
数组的顺序存储结构有两种:一种是按行序存 储,如高级语言BASIC、COBOL和PASCAL语言都 是以行序为主。另一种是按列序存储,如高级语言中 的FORTRAN语言就是以列序为主。
数据结构第五章数组和广义表
对于二维数组Amxn
以 行 为 主 的 存 储 序 列 为 : a11 ,a12, … a1n ,a21 ,a22 ,…,a2n , … … ,am1 ,am2 , …, amn
+1*(d3-c3+1)*(j2-c2)+1*(j3-c3) 其中l为每个元素所占存储单元数。
数据结构第五章数组和广义表
令α1=1*(d2-c2+1)*(d3-c3+1), α2=1*(d3-c3+1), α3=1,则:
பைடு நூலகம்
以 列 为 主 存 储 序 列 为 : a11, am1 ,a12 ,a22 ,… ,am2 ,… … ,a1n ,a2n , … ,amn
a21,…
假设有一个3×4×2的三维数组A ,其逻辑结构图为:
纵
列 行
数据结构第五章数组和广义表
以二维数组Amn为例,假设每个元素只占一个存 储单元,“以行为主”存放数组,下标从1开始,首元 素a11的地址为Loc[1,1] 求任意元素aij的地址 ,可由如 下计算公式得到:
注意:这里定义的数组下标是从1开始,与C语言的 数组略有不同。
数据结构第五章数组和广义表
5.2 数组的顺序存储和实现
对于数组A,一旦给定其维数n及各维长度bi (1≤i≤n),则该数组中元素的个数是固定的,不可 以对数组做插入和删除操作,不涉及移动元素操作, 因此对于数组而言,采用顺序存储法比较合适。
Am×n=
a12 a12 ┅
a1j
┅ a1n
a21 a22 ┅
a2j
┅ a2n
┇┇
ai1 ai2 ┅
aij
┇┇
┅ ain
am1 am2 ┅
amj
┅ amn
数据结构第五章数组和广义表
我们可以把二维数组看成一个线性表: A=( 1 2 … j … n),其中j(1≤j ≤n)本身也 是一个线性表,称为列向量。
B=(1,,2,,… ,m),其中i(1≤i ≤m)本身也是一个线性表, 称为行向量,即: I= (ai1,ai2, …,aij ,…,ain)。
B ‖
a12 a12 …
a1j
… a1n
1
a21 a22 … a2j
… a2n
2
┇┇
┇
Am×n=
ai1 ai2 … aij
… ain
i
┇┇
┇
am1 am2 …
第5章 数组和广义表
5.1 数组的定义和运算
5.2 数组的顺序存储和实现
5.3 特殊矩阵的压缩存储
5.3.1 三角矩阵
5.3.2 带状矩阵
5.3.3 稀疏矩阵
5.4 广义表
数据结构第五章数组和广义表
5.1 数组的定义和运算
数组是一种数据类型。从逻辑结构上看,数组可以 看成是一般线性表的扩充。二维数组可以看成是线 性表的线性表。例如:
数据结构第五章数组和广义表
基本操作:
(1)InitArray(A,n,bound1,…,boundn): 若维数n和各维的长 度合法,则构造相应的数组A,并返回TRUE; (2)DestroyArray(A): 销毁数组A; (3)GetValue(A,e, index1, …,indexn): 若下标合法, 用e返回数组A中由index1, …,indexn所指定的元素的值。 (4)SetValue(A,e,index1, …,indexn): 若下标合法, 则将数组A中由index1, …,indexn所指定的元素的值置为e。
数据结构第五章数组和广义表
如果将三维数组推广到一般情况,即:用j1,j2, j3代替数组下标i,j,k;并且j1,j2,j3的下限为c1, c2,c3,上限分别为d1,d2,d3,每个元素占一个存 储单元。则三维数组中任意元素a(j1,j2,j3)的地址 为:
Loc[j1,j2,j3]=Loc[c1,c2,c3]+1*(d2-c2+1)*(d3-c3+1)*(j1-c1)