数据结构讲义第5章-数组和广义表汇总
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.3.1特殊矩阵的压缩存储
1、对称矩阵
(1) 在一个n阶方阵A中,若元素满足下述性质: aij=aji 0≦i,j≦n-1 则称A为对称矩阵。 (2)压缩存储方法: 由于对称矩阵中的元素关于主对角线对称,故只要存 储矩阵中上三角或下三角中的元素,让每两个对称的元素 共享一个存储空间,则可将n2个元素存储到n(n-1)/2个元 素空间中。 不失一般性,以行序为主序存储其下三角的元素。
当i<=j 当i>j
n(n+1)/2
a11
a12
第1行
…
a1n
a22
a23
第2行
…
a2n
…
a nn c
第n行
5.4 广义表
5.4.1 广义表的概念 1 什么是广义表 广义表也称为列表,是线性表的一种扩展,也是数据元素的有 限序列。 记作:LS= (a1, a2, . . . . . .an)。其中ai既可以是单个元 素,也可以是广义表。 说明
0 1 2 3 4 5 n(n+1)/2- 1
a11
第1行
a21
a22
第2行
a31
a32
第3行
a33
…
an1
an2
ห้องสมุดไป่ตู้
…
第n行
an
图 一般对称矩阵的压缩存储
则sa[k]和aij之间的下标对应关系为: i(i-1)/2+j-1 k= j(j-1)/2+i-1 当i<j 当i>=j
2、三角矩阵
形下图的矩阵称为三角矩阵,其中c为某个常数。其中(a)为上三角矩阵:主对 角线以下均为同一个常数;(b)为下三角矩阵,主对角线以上为同一个常数;
通常有两种顺序存储方式:
⑴行优先顺序——将数组元素按行排列,第i+1个行 向量紧接在第i个行向量后面 在PASCAL、C语言中,数组就是按行优先顺序存 储的。 ⑵列优先顺序——将数组元素按列向量排列,第j+1 个列向量紧接在第j个列向量之后 在FORTRAN语言中,数组就是按列优先顺序存储的。
a00 a01
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)),
例1:设二维数组A68按“行优先顺序”存储在内存中,每个元 素占用6个存储单元,已知A的起始地址为1000,计算a14的 地址。。 解:LOC(a14)=LOC(a00)+[i*n+j]*l =1000+[1*8+4]*6=1072 例2:设二维数组A[0..8,1..10], 每元素占6字节,已知A的起 始地址为1000,求: (1)存储A共需多少字节?(2)以行序为主序存储,求a85的 地址。(3)A的第8列第5行共占多少字节? 解: (1)共需((d2-c2+1)*(d1-c1+1))*l=10*9*6=540字节 (2)LOC(a85)=LOC(ac1c2)+[(j1-c1)*(d2-c2+1)+(j2c2)]*l=1000+[8*10+4]*6=1504 (3)第8列共有9个元素,第5行有10个元素,第8列第5行共 有9+10-1个元素,共占18*6个字节。
a10 a11
对于二维数组:
a0 n-1
a1 n-1
Amn=
am-1 0 am-1 1 am-1 n-1
mn-1 am-1n-1 nm-1
以行为主序的方式: 0 1 n-1 n n+1 2n-1
a00 a01
a0n-1 a10 a11
a1n-1
2m-1
am-10
以列为主序的方式: 0 1 m-1 m m+1
一、数组的顺序存储表示
#include <stdarg.h> #define MAX_ARRAY_DIM 8 typedef struct{ ElemType *base; int dim; int *bounds; int *constants; }Array;
二、数组操作的实现
5.3 矩阵的压缩存储
例:5阶对称方阵及它的压缩存储
A= 3 6 4 7 8 6 2 8 4 2 4 8 1 6 9 7 4 6 0 5 8 2 9 5 7
3 6 2 4 8 1 7 4 6 0 8 2 9 5 7
一般地,设对称矩阵A的下三角部分以行为主序顺序存储 到一个向量SA[n(n+1)/2]中,如图所示。
n(n+1)/2
k=
n(n+1)/2
0 1 2 3 4 5
a11
第1行
a21
a22
第2行
a31
a32
第3行
a33
…
an1
an2
…
第n行
an
c
上三角矩阵 设存入向量:SA[n*(n+1)+1]中,sa[k] 与aij 的对应关系 为: (i-1)(2n-i+2)/2+j-i k= n(n+1)/2
0 1 2 3 4 5
5.1 数组的定义和运算
一、数组的概念
1、n维数组:n维数组是由∏bi个元素组成,每个元素受着n 个关系的约束。在每个关系中,元素aj1j2…jn(0≤ji≤bi-2)都 有一个后继。故这n 个关系是线性关系。 数组中的所有元素必须属于同一数据类型。每个元素都 对应一组下标(j1,j2,…jn),每个下标的范围0≤ji≤bi-1 , bi称为第i维的长度。 ∏bi为n维数组的长度。 当n=1时,n维数组退化为定长的线性表。
a00 a10
am-10 a01 a11
am-11
a0n-1 a1n-1
am-1n-1
以行为主序: LOC(aij)=LOC(a00)+(i*n+j)*l 以列为主序: LOC(aij)=LOC(a00)+(j*m+n)*l 一般地,对A[c1..d1,c2..d2] 则:以行为主序有: LOC(aij)=LOC(ac1c2)+[(i-c1)*(d2-c2+1)+(j-c2)]*l 以列为主序: LOC(aij)=LOC(ac1c2)+[(j-c2)*(d1-c1+1)+(i-c1)]*l
在大多数情况下,三角矩阵常数为零。 a11 a12 … a 1n a11 c … c c a22 … a 2n a21 a22 … c ………………….. …………….. c c … a nn an 1 an 2 … an n
(a)上三角矩阵 (b)下三角矩阵
下三角矩阵 与对称矩阵类似,设存入向量:SA[n*(n+1)+1]中,sa[k] 与aij 的对应关系为: i(i-1)/2+j-1 当i>=j 当i<j
对于一个矩阵结构,显然用一个二维数组来表示是非常 恰当的。但有时会遇到这样一类矩阵:在这种矩阵中有 许多值相同的元素或者是零元素、为了节省存储空间, 可以对这类矩阵进行压缩存储。 压缩存储是:为多个值相同的元素只分配一个存储空间: 对零元素不分配存储空间。 特殊矩阵:值相同的元素或者零元素在矩阵中的分布有 一定规律,则称此类矩阵为特殊矩阵,反之,称为稀疏 矩阵。
5.3求下列广义表的操作结果 GetHead[((a),a)] GetTail[((a),a)] GetTail[GetHead[((a,b),(c,d))]] GetHead[GetHead[((a,b),(c,d))]]
j
a1j a2j
┅
n)
a1n a2n
┅ ┅
┅ ┅
Am×n=
ai1 ┇
am1 am2
矩阵Am×n看成n个列向量的线性表,即j=(a1j,a2j, …,amj)
我们还可以将数组Am×n看成另外一个线性表: B=(1,,2,,… ,m),其中i(1≤i ≤m)本身也是一个线性表, 称为行向量,即: I= (ai1,ai2, …,aij ,…,ain)。 B ‖
aij-1 aij+1
ai-1j ai+1j
Amn=
am-1 0 am-1 1 am-1 n-1
我们可以把二维数组看成一个线性表: A=( 1 2 … j … n),其中j(1≤j ≤n)本身也 是一个线性表,称为列向量。
A=( 1 2
a11 a21 ┇ a12 a22 ┇ ai2 ┇ ┅ amj ┅ amn ┅ aij ┅ ain ┅
1)广义表的定义是一个递归定义,因为在描述广义表时又用到 了广义表;
2)在线性表中数据元素是单个元素,而在广义表中, 元素可以 是单个元素, 称为单元素(原子),也可以是广义表,称为广义表 的子表; 3)n 是广义表长度;
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 广义表, 第四个是单元素; 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
Am×n=
ai1 ┇
am1 am2
二、数组的基本操作 1 2 读元素操作 写元素操作 操作方法根据其存储结构决定
5.2 数组的顺序表示和实现 数组一旦建立,结构中的元素个数和元 素间的关系就不再发生变化。因此,一般 都是采用顺序存储的方法来表示数组。 由于计算机的内存结构是一维的,因此 用一维内存来表示多维数组,就有次序约 定的问题。
表头:A 表尾 (B,C,f )
运算可以嵌套,如:
HEAD(TAIL(B))=b, TAIL(TAIL(B))=(c, d) 。
习题五
5.1 假设按行优先存储整数数组A[9][3][5][8]时,第一个元素 的字节地址时100,每个整数占4个字节。问下列元 素的存储地址是什么。 (1) a0000 (2)a1111 (3)a3125 5.2 数组A中,每个元素A的存储占3个单元,行下标i从1到8, 列下标j从1到10,从首地址SA开始连续存放在存储器内, 存放该数组至少需要的单元个数是( (1) ),若该数组 按行存放时,元素A[8][5]的起始地址是( (2) ),若该数 组按列存放时,元素A[8][5]的起始地址是( (3) )。 (1)A. 80 B.100 C.240 D.270 (2)A.SA+141 B.SA+144 C.SA+222 D.SA+225 (3)A.SA+117 B.SA+180 C.SA+222 D.SA+225