数据结构讲义第5章-数组和广义表

合集下载

第五讲数组和广义表-

第五讲数组和广义表-

解决问题的原则:
1) 尽可能少存或不存零值元素;
2) 尽可能减少没有实际意义的运算;
3) 操作方便。 即: 能尽可能快地找到与
下标值(i,j)对应的元素, 能尽可能快地找到同
一行或同一列的非零值元。
有两类稀疏矩阵:
1) 特殊矩阵 非零元在矩阵中的分布有一定规则
例如: 三角矩阵 对角矩阵
2) 随机稀疏矩阵 非零元在矩阵中随机出现
图5.2 三角矩阵
三角矩阵中的重复元素c可共享一个存储空间, 其余的元素正好有n(n+1)/2个,因此,三角矩 阵可压缩存储到向量sa[0..n(n+1)/2]中,其中c 存放在向量的最后一个分量中,
上三角矩阵中,主对角线之上的第p行(0≦p<n) 恰有n-p个元素,按行优先顺序存放上三角矩阵 中的元素aij时,aij之前的i行一共有
(n-p)=i(2n-i+1)/2
个元素,在第i行上,aij前恰好有j-i个元素: aij,aij+1,…aij-1。因此,sa[k]和aij的对应关系是:
i(2n-i+1)/2+j-i 当i≦j
kn=(n+1)/2
当i>j
下三角矩阵的存储和对称矩阵类似,sa[k]和aij对应 关系是:
i(i+1)/2+j i≧j k=n(n+1)/2 i>j
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 } 基本操作:

数据结构第五章数组和广义表

数据结构第五章数组和广义表
typedef elemtype Array2[m][n]; 等价于
typedef elemtype Array1[n]; typedef Array1 Array2[m]; 同理,可以用 n-1 维数组的数据类型来定义 n 维数组。
8
第8页
5.2 数组的顺序存贮结构
一、数组的顺序表示和实现
(1) 类型特点 ① 只有引用型操作,一般不作插入或删除操作; ② 数组是多维的结构,而存储空间是一个一维的结构。
第 17 页
(2) 压缩存储的有关概念 ① 压缩存储:为多个值相同的元素分配一个存储空间,对零 元不分配空间。 ② 特殊矩阵:值相同的元素或零元素在矩阵中的分布有一定 规律。 ③ 稀疏矩阵:值相同的元素或者零元素在矩阵中的分布无规 律。
第 18 页
(3) 特殊矩阵
① 概念:若n阶矩阵 A 中的元满足:aij=aji 1≤i,j≤n,则 称为n 阶对称矩阵。
第1页
第五章 数组和广义表
5. 1 数组的定义 5.2 数组的顺序存储结构 5. 3 矩阵的压缩存储 5. 4 广义表的定义 5.5 广义表的存储结构
第2页
第五章 数组和广义表
前4章介绍的数据结构共同特点: ▲ 都属于线性数据结构; ▲ 每种数据结构中的数据元素,都作为原子数据, 不再进行分解; 本章讨论的两种数据结构:数组和广义表,其共 同特点是: ▲ 从逻辑结构上看它们,可看成是线性结构的一 种扩展; ▲ 数据元素本身也是一个数据结构;
4
第4页
(2) 二维数组的解释
二维数组中的每个元素都受两个 线性关系的约束,即行关系和列关系, 在每个关系中,每个元素aij都有且仅 有一个直接前趋,都有且仅有一个直 接后继。
aa … 00 01

《数据结构——用C语言描述(第二版)》第5章 数组和广义表

《数据结构——用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

数据结构第5章

数据结构第5章

第5章:数组和广义表 1. 了解数组的定义;填空题:1、假设有二维数组A 6×8,每个元素用相邻的6个字节存储,存储器按字节编址。

已知A 的起始存储位置(基地址)为1000,则数组A 的体积(存储量)为 288 B ;末尾元素A 57的第一个字节地址为 1282 。

2、三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的 行下标 、 列下标 和 元素值 。

2. 理解数组的顺序表示方法会计算数组元素顺序存储的地址;填空题:1、已知A 的起始存储位置(基地址)为1000,若按行存储时,元素A 14的第一个字节地址为 (8+4)×6+1000=1072 ;若按列存储时,元素A 47的第一个字节地址为 (6×7+4)×6+1000)=1276 。

(注:数组是从0行0列还是从1行1列计算起呢?由末单元为A 57可知,是从0行0列开始!) 2、设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为 8950 。

答:不考虑0行0列,利用列优先公式: LOC(a ij )=LOC(a c 1,c 2)+[(j-c 2)*(d 1-c 1+1)+i-c 1)]*L 得:LOC(a 32,58)=2048+[(58-1)*(60-1+1)+32-1]]*2=8950选择题:( A )1、假设有60行70列的二维数组a[1…60, 1…70]以列序为主序顺序存储,其基地址为10000,每个元素占2个存储单元,那么第32行第58列的元素a[32,58]的存储地址为 。

(无第0行第0列元素)A .16902B .16904C .14454D .答案A, B, C 均不对 答:此题(57列×60行+31行)×2字节+10000=16902( B )2、设矩阵A 是一个对称矩阵,为了节省存储,将其下三角部分(如下图所示)按行序存放在一维数组B[ 1, n(n-1)/2 ]中,对下三角部分中任一元素a i,j (i ≤j), 在一维数组B 中下标k 的值是:A .i(i-1)/2+j-1B .i(i-1)/2+jC .i(i+1)/2+j-1D .i(i+1)/2+j3、从供选择的答案中,选出应填入下面叙述 ? 内的最确切的解答,把相应编号写在答卷的对应栏内。

数组和广义表 数据结构

数组和广义表  数据结构

3.建立广义表的存储结构 假定广义表中的元素类型ElemType为chai类型,每个原子的值被限 定为英文字母。并假定广义表是一个表达式,其格式为:元素之间用一 个逗号分隔,表元素的起止符号分别为左、右圆括号,空表在其圆括号 内不包含任何字符。例如“(a,(b, c, d))”就是一个符合上述规定的广 义表格式。 建立广义表存储结构的算法同样是一个递归算法。该算法使用一个 具有广义表格式的字符串参数s,返回由它生成的广义表存储结构的头结 点指针h。在算法的执行过程中,需要从头到尾扫描s的每一个字符。当 碰到左括号时,表明它是一个表元素的开始,则应建立一个由h指向的表 结点,并用它的sublist域作为子表的表头指针进行递归调用,来建立子 表的存储结构;当碰到一个英文字母时,表明它是一个原子,则应建立 一个由h指向的原子结点;当碰到一个“)”字符时,表明它是一个空表, 则应置h为空。当建立了一个由h指向的结点后,接着碰到逗号字符时, 表明存在后继结点,需要建立当前结点(即由h指向的结点)的后继表; 当碰到右括号或分号字符时,表明当前所处理的表已结束,应该置当前 结点的link域为空。 4.输出广义表 5.广义表的复制
广义表的转换过程
为了使子表和原子两类结点既能在形式上保持一致,又能进
行区别,可采用如下结构形式:
其中,tag域为标志字段,用于区分两类结点。sublist或data
域由tag决定。若tag=0,表示该结点为原子结点,则第二个 域为data,存放相应原子元素的信息;若tag=l,表示该结点 为表结点,则第二个域为sublist,存放相应子表第一个元素 对应结点的地址。link域存放与本元素同一层的下一个元素所 在结点的地址,当本元素是所在层的最后一个元素时,link域 为NULL。 例:前面的广义表C的存储结构如下图所示(很多《数据结构 公教科书上称之为带表头结点的广义表的链表存储结构

第5章数组和广义表

第5章数组和广义表
//L=1,指针的增减以元素的大小为单位 For(i=dim-2;i>0;--i)
A.contants[i]=A.bounds[i+1]*A.constants[i+1]; return ok; }
第5章 数组和广义表
Status DestoryArray(Array &A){ //销毁数组 if(!A.base) return ERROR; free(A.base); A.base=NULL; if(!A.bounds) return ERROR; free(A.bounds); A.bounds=NULL; if(!A.contants) return ERROR; free(A.contants) A.contants=NULL; return ok;
(3) Value(A,&e, index1, …, indexn): 若下标合法,则 用e返回数组A中由index1, …, indexn所指定的元素的值。
(4) Assign(&A,e,indexl,…indexn):若各下标不超界, 则将e赋值为所指定的A的元素值,并返回OK。 。
第5章 数组和广义表
三维数组A(1..r , 1..m , 1..n)可以看成是r个m×n的二维数组,
如图5.5所示。
n
m n
r j- 1
m
k- 1
图5.5 三维数组看成r个m×n的二维数组
第5章 数组和广义表
假定每个元素占一个存储单元,采用以行为主序的方法存 放,即行下标r变化最慢, 纵下标n变化最快。 首元素a111的地 址为Loc[1, 1, 1],求任意元素aijk的地址。
第5章 数组和广义表
以上我们以二维数组为例介绍了数组的结构特性,实际 上数组是一组有固定个数的元素的集合。也就是说,一旦定 义了数组的维数和每一维的上下限,数组中元素的个数就固 定了。 例如二维数组A3×4,它有3行、4列,即由12个元素组 成。由于这个性质,使得对数组的操作不像对线性表的操作 那样可以在表中任意一个合法的位置插入或删除一个元素。 对于数组的操作一般只有两类:

数据结构课件PPT数组和广义表

数据结构课件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]; } }

大学数据结构课件--第5章 数组和广义表

大学数据结构课件--第5章 数组和广义表

a 32 a 33 a 34 0 0
a 43 a 44 a 45 0
a 54 a 55 a 56 a 65 a 66
5.3.2 稀疏矩阵
稀疏矩阵的存储:如何表示非零元素的位置信息 1. 三元组表:每个元素用一个三元组(i,j,v)来表示。 i j v
0 1 6 1 1 6 2 3 8 12 9
2
3 4 5 6 7 8
2
5.2 数组的顺序表示和实现
a00 a00 a10 a01 存储单元是一维结构,而数组是个多维结构 , …… …… 则用一组连续存储单元存放数组的数据元素就有 am-1,0 a0,n-1 个次序约定问题。 a01 a10
a11
……
a11
……
二维数组可有两种存储方式: am-1,1 a1,n-1
……
K=
i*n-i(i-1)/2+j-i n(n+1)/2
当 i≤j 当i>j
0 a11 ... a1n-1 ... ... ... ... 0 0 0 an-1n-1
当i ≤ j时,a[i][j]是非零元素, a[i][j]前面有i行,共有n+(n-1)+(n-2)+…(n-(i-1))
=i(n+[n-(i-1)])/2=i*n-i(i-1)/2个元素,a[i][j]前面有j列,共j-i个非零元素,
A m× n
( a10 a11 … a1,n-1 )
=
注:
( … … …… ) ( am-1,0 am-1,2 … am-1,n-1 ) ( ( ( (
① 数组中的元素都具有统一的类型; ② 数组元素的下标一般都具有固定的上界和下界,即数组一旦 被定义,它的维数和维界就不再发生改变; ③ 数组的基本操作简单:初始化、销毁、存取元素和修改元素值

数据结构第5章数组与广义表

数据结构第5章数组与广义表
0 0 3 0 1 0 1 2 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 2 0
一个稀疏矩阵里存在大量的零元素,若 以常规方法,即以二维数组来存储稀疏矩 阵时产生如下问题: 1) 零值元素占了很多空间; 2) 如果进行计算,则会进行很多和零值 的运算,如是除法,还需判别除数是否为 零。
2 三角矩阵 以主对角线划分,三角矩阵有上三角 和下三角两种。如图所示。其中(a)图为下 三角矩阵:主对角线以上均为同一个常 数;(b)图为上三角矩阵,主对角线以下均 为同一个常数。
(1) 下三角矩阵 三角矩阵中的重复元素c可共享一个 存储空间,其余的元素正好有n(n+1)/2 个,因此,三角矩阵可压缩存储到向量 SA[0…n(n+1)/2]中,其中c存放在向量的 最后1个分量SA[n(n+1)/2]中。 该存储方式可节约n*(n-1)/2-1个存储 单元。
传统矩阵的转置算法为: for(col=1; col<=n ;++col) for(row=0 ; row<=m ;++row) b[col][row]=a[row][col] ;
时间复杂度为O(n×m) 当非零元素的个数tn和m×n同数量级时,算法 TransMatrix的时间复杂度为O(m×n2)。
以“行优先顺序”存储: (1) 第1行中的每个元素对应的(首)地址是: LOC[a1j]=LOC[a11]+(j-1) ×L (2) 第2行中的每个元素对应的(首)地址是: LOC[a2j]=LOC[a11]+n×L +(j-1) ×L (3) 第m行中的每个元素对应的(首)地址是: LOC[amj]=LOC[a11]+(m-1) n×L +(j-1) ×L

数据结构数组和广义表

数据结构数组和广义表

数据结构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章-数组和广义表

数据结构讲义第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

第五章数组广义表

第五章数组广义表

(1)A=( )
(4)D=(A,B,C)
(2)B=(e)
(5)E=(a,E)
(3)C=(a,(b,c,d))
广义表的长度指广义表中元素的个数。
广义表的深度指广义表中括弧的重数。
从上述定义和例子可推出三个重要结论:
(1)列表的元素可以是子表,而子表的元素还可 以是子表,…。
(2)列表可以为其它列表所共享。 (3)列表可以是一个递归的表。 一、广义表的存储结构 由于广义表(a1,a2,a3,…,an)中的元素可以具有 不同的结构,因此难以用顺序存储结构表示。通 常采用链式存储结构,每个数据元素可用一个结 点表示。
else { *elem= A.elem[index1][index2];
return OK; } }
5.3矩阵的压缩存储
矩阵是在很多科学与工程计算中遇到的数学模型。 在数学上,矩阵是这样定义的:它是一个由s×n个元
素排成的s行(横向)n列(纵向)的表。下面就是一
个矩阵:
a11 a12 a 21 a 22 ... ... am1 am 2
第五章 数组和广义表
本章主要介绍下列内容 数组的定义 数组的顺序表示和实现 矩阵的压缩存储 稀疏矩阵 广义表
5.1 数组的定义
一、数组的定义和基本运算 数组的特点是每个数据元素可以又是一个线性表 结构。因此,数组结构可以简单地定义为:若线性表 中的数据元素为非结构的简单元素,则称为一维数组, 即为向量;若一维数组中的数据元素又是一维数组结 构,则称为二维数组;依次类推,若二维数组中的元 素又是一个一维数组结构,则称作三维数组。 结论:线性表结构是数组结构的一个特例,而数 组结构又是线性表结构的扩展。举例:
... a1n ... a 2 n ... ... ... amn 图5-2 Nhomakorabea×n的矩阵
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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 ┅
通常有两种顺序存储方式:
⑴行优先顺序——将数组元素按行排列,第i+1个行 向量紧接在第i个行向量后面 在PASCAL、C语言中,数组就是按行优先顺序存 储的。 ⑵列优先顺序——将数组元素按列向量排列,第j+1 个列向量紧接在第j个列向量之后 在FORTRAN语言中,数组就是按列优先顺序存储的。
a00 a01
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 ) 递归表.
推广到n维数组Ab1b2..bn LOC(aj1j2..jn)=LOC(a00..0)+(j1*b2*b3*…*bn+j2*b3*b4*…*bn+…+jn1*bn+jn)*l 以列为主序: LOC(aj1j2..jn)=LOC(a00..0)+(jn*bn-1*bn-2*…*b1+jn-1*bn-2*bn3*…*b1+…+j2*b1+j1)*l 一般地,对A[c1..d1,c2..d2,…,cn..dn] 则:以行为主序有: LOC(aj1j2..jn)=LOC()+[(j1-c1)*(d2-c2+1)*(d3-c3+1)*…*(dncn+1)+(j2-c2)*(d3-c3+1)*(d4-c4+1)*…*(dn-cn+1)+…+(jn-1-cn-1)*(dn cn+1)+jn-cn]*l 以列为主序: LOC(aj1j2..jn)=LOC()+[(jn-cn)*(dn-1-cn-1+1)*(dn-2-cn2+1)*…*(d1-c1+1)+(jn-2-cn-2)*(dn-3-cn-3+1)*(dn-4-cn-4+1)*…*(d1c1+1)+…+(j2-c2)*(d1-c1+1)+j1-c1]*l
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)为下三角矩阵,主对角线以上为同一个常数;
对于一个矩阵结构,显然用一个二维数组来表示是非常 恰当的。但有时会遇到这样一类矩阵:在这种矩阵中有 许多值相同的元素或者是零元素、为了节省存储空间, 可以对这类矩阵进行压缩存储。 压缩存储是:为多个值相同的元素只分配一个存储空间: 对零元素不分配存储空间。 特殊矩阵:值相同的元素或者零元素在矩阵中的分布有 一定规律,则称此类矩阵为特殊矩阵,反之,称为稀疏 矩阵。
以二维数组为例:二维数组中的每个元素都受两个线性关
系的约束即行关系和列关系,在每个关系中,每个元素aij 都有且仅有一个直接前趋,都有且仅有一个直接后继。
在行关系中 aij直接前趋是 aij直接后继是 在列关系中 aij直接前趋是 aij直接后继是
a00 a01 a10 a11
a0 n-1 a1 n-1
例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个字节。
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 ‖
一、数组的顺序存储表示
#include <stdarg.h> #define MAX_ARRAY_DIM 8 typedef struct{ ElemType *base; int dim; int *bounds; int *constants; }Array;
二、数组操作的实现
5.3 矩阵的压缩存储
表头:A 表尾 (B,C,f )
运算可以嵌套,如:
HEAD(TAIL(B))=b, TAIL(TAIL(B))=(c, d) 。
5.4 广义表
广义表的元素之间除了存在次序关系外,还存在层次关系。如:
D
A
B
C
faΒιβλιοθήκη Debc
d
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维数组退化为定长的线性表。
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 数组的顺序表示和实现 数组一旦建立,结构中的元素个数和元 素间的关系就不再发生变化。因此,一般 都是采用顺序存储的方法来表示数组。 由于计算机的内存结构是一维的,因此 用一维内存来表示多维数组,就有次序约 定的问题。
例:5阶对称方阵及它的压缩存储
A= 3 6 4 7 8 6 4 7 8 2 8 4 2 8 1 6 9 4 6 0 5 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]中,如图所示。
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
第五章 数组和广义表
5.1 数组的定义 5.2 数组的顺序表示和实现 5.3 矩阵的压缩存储 5.3.1 特殊矩阵 5.4 广义表的定义
前4章介绍的数据结构共同特点: (1)都属于线性数据结构; (2)每种数据结构中的数据元素,都作为原子数据,不再进 行分解; 本章讨论的两种数据结构:数组和广义表,其共同特点是: 1)从逻辑结构上看它们,可看成是线性结构的一种扩展; 2)数据元素本身也是一个数据结构;
5.3.1特殊矩阵的压缩存储
1、对称矩阵
(1) 在一个n阶方阵A中,若元素满足下述性质: aij=aji 0≦i,j≦n-1 则称A为对称矩阵。 (2)压缩存储方法: 由于对称矩阵中的元素关于主对角线对称,故只要存 储矩阵中上三角或下三角中的元素,让每两个对称的元素 共享一个存储空间,则可将n2个元素存储到n(n-1)/2个元 素空间中。 不失一般性,以行序为主序存储其下三角的元素。
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)),
相关文档
最新文档