第五章数组和广义表

合集下载

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

数据结构第五章 数组与广义表
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中列号
一、三元组顺序表
对于稀疏矩阵,非零元可以用三元组表示, 整个稀疏矩阵可以表示为所有非零元的三元组所 构成的线性表。例如:

第五章数组和广义表

第五章数组和广义表
ai,1 ai,2 … ai,j … ai,n an,1 an,2… an,j … an,n
i(i-1)/2+j-1 (i≥j) k= 第五章数j组(j和-1广)义/2表+i-1 (i<j)
第五章数组和广义表
5.1 数组的类型定义 5.2 数组的顺序存储和实现 5.3 特殊矩阵的压缩存储 5.4 广义表
第五章数组和广义表
5.1 数组的定义和运算
数组是一种数据类型。从逻辑结构上看,数 组可以看成是一般线性表的扩充。二维数组可 以看成是线性表的线性表。例如:
Am×n=
a11 a12 … a1j ……
LO(0C ,0,..0.) , ci ji (Cn=L,ci-1=bi*ci,1<i≤n) i1
数组元素的存储位置是其下标的线性函数,由于计算各 个元素存储位置的时间相等,所以存储数组中任一元素的 时间也相等,称具有这一第五特章数点组和的广义存表 储结构为随机存储结构。
N维数组数据元素存储地址计算
i= (ai1,ai2, …,aij ,…,ain)。
B

a11 a12 … a1j … a1n
1
……

Am×n= ai1 ai2 … aij … ain
i
……

am1 am2 … amj … amn
m
第五章数组和广义表
看一个二维数组的简单情况。
D={aij|0≤i≤b1-1,0≤j≤b2-1, aij∈ ElemType}
}
第五章数组和广义表
5.3 矩阵的压缩存储
• 压缩存储:为多个值相同的元素只分配一个存 储空间,对零元素不分配空间。
• 目的:节省存储空间 • 任务:压缩存储矩阵并使矩阵的运算有效进行。 • 矩阵的存储:二维数组 • 可压缩存储的矩阵有两类:

第5章数组与广义表

第5章数组与广义表


5.2 数组的顺序表示和实现

特点:用一组地址连续的存储单元按照某种规则存放数组 中的数据元素。 两种规则(顺序存储方式):


以行序为主(低下标优先)—将数组元素按行排列,第 i+1个行向量紧接在第i个行向量后。如:PASCAL、C。 以列序为主(高下标优先)—将数组元素按列排列,第 j+1个列向量紧接在第j个列向量后。如:FORTRAN。
am-1,0 a01 a11 …… am-1,1
……
按 列 序 为 主 序
a0,n-1 a1,n-1
……
am-1,n-1 am-1,n-1 ?A[2][3][2]以行序为主存储,写出其元素存放的先后顺序
5.2 数组的顺序表示和实现


计算数组任一元素(a j1 j2 ... jn )的地址需要的三要素: ①数组的起始地址(即基地址) ②数组维数和各维的长度; ③数组中每个元素所占的存储单元 已知二维数组Ab1*b2,每个元素占L个存储单元, LOC(0,0)是 数组第一个元素的起始地址,以行序为主存储,求LOC(i,j)。
N维数组数据元素存储地址计算
1、数组M[1..10][-1..6][[0..3],起始地址是1000,每个元素占3个 存储单元,数组元素个数是 ,M[2][4][2]的地址是 。 2、数组A[0 .. 8][1 .. 10]的成员由6个字节组成,存放a要 个字 节,a的第8行第5列占 个字节。按行序a[8][5]与按列序 起始地址相同。 (10-1+1)*(6-(-1)+1)*(3-0+1)=320 LOC(M[2][4][2])=1000+[(i-1)*b2*b3+(j-(-1))*b3+k]*l =1000+[32*(2-1)+4*(4+1)+2]*3=1162 LOC(a[8][5])=a(起始地址)+(i*n+(j-1))*l =a+(8*10+4)*6=a+504, LOC(a[3][10])=a(起始地址)+((j-1)*m+i)*l =a+(9*9+3)*6=a+504。

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

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

第5章数组和广义表

第5章数组和广义表

5.1 数组的定义
由于数组中各元素具有统一的类型, 并且数组元素的下标一般具有固定的上界 和下界,因此,数组的处理比其它复杂的 结构更为简单。多维数组是向量的推广。 例如,二维数组:
Amn (a11 (a 21 ( ... (a m1 a12 ... ... ... a 22 am2 a1n ) ... ... a 2 n) ... ... ... ) ... ... a mn)
第五章 数组和广义表
• 5.1 数组的定义 • 5.2 数组的顺序表示和实现 • 5.3 矩阵的压缩存储 5.3.1 特殊矩阵 5.3.2 稀疏矩阵 • 5.4 广义表的定义 • 5.5 广义表的存储结构
数组和广义表可看成是一种特殊的线性表, 其特殊在于,表中的数据元素本身也是一种线 性表。 虽然数组不能吻合线性表的定义,但经过适 当的转换,完全可以如同线性表的相关操作来 处理数组。
a01
1
a10
2a11Leabharlann 3a124
a21
5
… … a n-1 n-2
… … 3n-2
a n-1 n-1
3n-1
数组sa中的元素sa[k]与三对角带状矩阵中的元素aij 存在一一对应关系,在aij之前有i行,共有3*i-1个非零元 素,在第i行,有j-i+1个非零元素,这样,非零元素aij 的地址为:
LOC(i,j)=LOC(0,0)+[3*i-1+(j-i+1)]*d =LOC(0,0)+(2i+j)*d 上例中, a34对应着sa[10]。k=2*i+j=2*3+4=10。 a21对应着sa[5]。k=2*2+1=5。 由此,我们称sa[0..3*n-3]是阶三对角带状矩阵A 的压缩存储表示。

第5章数组广义表

第5章数组广义表

am-1,n-1
Loc(aij) = b+( aij前元素个数)•L= b+[i×n+j]×L( 存储器)
例5-1 设二维数组A[7][8],起始地址b=1000,每个元素所占单元量L=3, 则Loc(a5,6)=1000+(5•8+6)3 = 1138。
数组元素的地址计算
3.三维数组: aijk ai00 aij0
数组元素的地址计算
4.n 维数组 从以上的地址公式推导中得出这样一条规律: 任意维数组中任一元素的地址= 起址b+ 该元素前的个数×元素单元量L。 故n维数组A[u1][u2]…..[un],其中任一元素ai1....in的地址为:
Loc(ai1i2……in)=b+(i1•u2•u3• … •un+i2•u3•u4• …un+…+in-1•un+in)•L =b+(

A[i]
A(2) = A[m][n] =
ai0 ai1 …… aij ….… ain-1
………………………….

A[m-1]
am-10 am-11 …am-1j … am-1n-1
= (A[0]……A[i]……A[m-1] )-----线性表形式
2.数组的基本运算
多维数组是线性表的推广,而线性表是多维数组的特例。 在算法语言中,数组一旦生成,其元素的存储空间就固定下来,故数组 的运算一般不包括插入和删除这样的操作。对数组运算有: (1) 构造一个n维数组:Setarray(A,n,d1d2,......dn),即生成: A[d1][d2].....[dn](C语言中,1≤n≤8)。 (2) 撤消一个数组:Dearray(A),释放数组A的存储空间。 (3) 取值:Aget(A,i1,...,in,x),将A[i1][i2],...,[in]的值传给变量 x。 (4) 赋值:Assign(A,i1,...,in,x),将变量 x的值传给A[i1][i2].....[in]。

数组和广义表 数据结构

数组和广义表  数据结构

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

第五章数组和广义表讲课提要【主要内容】1.多维数组的顺序存储结构2.特殊矩阵的压缩存储3.广义表的定义及其与线性表的关系4.广义表的存储结构5.广义表运算实现中递归的应用【教学目标】1.掌握多维数组的顺序存储结构2.掌握特殊矩阵的压缩存储方法3.掌握广义表的定义及其与线性表的关系4.掌握广义表的存储结构5.了解广义表运算实现中递归的应用学习指导1.多维数组的顺序存储结构对于多维数组,有两种存储方式:一是以行为主序(或先行后列)的顺序存放,如BASIC、PASCAL、C等程序设计语言中用的是以行为主的顺序分配,即一行分配完了接着分配下一行。

另一种是以列为主序(先列后行)的顺序存放,如FORTRAN语言中,用的是以列为主序的分配顺序,即一列一列地分配。

以行为主序的分配规律是:最右边的下标先变化,即最右下标从小到大,循环一遍后,右边第二个下标再变,…,从右向左,最后是左下标。

以列为主序分配的规律是:最左边的下标先变化,即最左下标从小到大,循环一遍后,左边第二个下标再变,…,从左向右,最后是右下标。

不论按何种方式存储,只要确定了数组的首地址以及每个数组元素所占用的单元数,就可以将数组元素的存储地址表示为其下标的线性函数。

设有m×n二维数组A mn,以“以行为主序”的分配为例,按照元素的下标确定其地址的计算方法如下。

设数组的基址为LOC(a11),每个数组元素占据L个地址单元,计算a ij 的物理地址的函数为:LOC(a ij) = LOC(a11) + ( (i-1)*n + j-1 ) * L同理,对于三维数组A mnp,即m×n×p数组,对于数组元素a ijk其物理地址为:LOC(a ijk)=LOC(a111)+( ( i-1) *n*p+ (j-1)*p +k-1) )*L注意:在C语言中,数组中每一维的下界定义为0,则:LOC(a ij) = LOC(a00) + ( i*n + j ) * L【例4-1】二维数组A的每一个元素是由6个字符组成的串,其行下标i=0,1,…,8,列下标j=1,2,…,10。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(a) (b)
图5.7
1
2
-
3
1
3
1
2
3
1
2
6
-
1
4
3
2
5
5
4
0
0
0
0
0
0
0
0
0
0
6
6
0
0
0
0
0
0
0
0
0
0
0
0
H2 H4 H5 H6 H3 H1
H4
0
0
H3
H5
H6 Head
H1
H2
5.画出下列广义表的存储结构图,并利用Head和Tail操作分离出原子e。
(1) L=(((a)),(b),c,(a),(((d,e))))
具体转换公式如下:
k=int((i-1)/2)*4+(i-1)%2*2+1当i<j或当i=j且i为偶数
k=int((i-1)/2)*4+(i-1)%2*2当i>j或当i=j且i为奇数
3.设稀疏矩阵
0-31000
00100-1
000000
002000
000040
000000
A
(1)画出其三元组表形成的压缩存储表。
A.表达变得简单B.对矩阵元素的存取变得简单
C.去掉矩阵中的多余元素D.减少不必要的存储空间的开销
分析:答案应选择D。
4.若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对
角线上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中,则在B中确
定aij(i<j)的位置k的关系为______。
义表H中某元素b的运算式______________。
答案:GetHead(GetTail(GetHead(GetTail(H))))
分析:本题的解题思路可参见5.2.1节第5题,获得元素b操作的运算式

GetHead(GetTail(GetHead(GetTail(H))))。具体过程如下:
(1)GetTail(H)=((a,b,c).下面的说法不正确的是____________。
A.数组是一种线性结构B.数组是一种定长的线性表结构
C.除了插入与删除操作外,数组的基本操作还有存取、修改、检索和
排序等
D.数组的基本操作有存取、修改、检索和排序等,没有插入和删除操

分析:数组的主要操作是存取、修改、检索和排序。数组没有插入和修改
元素个数已经确定,不能进行插入和删除运算。但线性表可以插入删除。
二.填空题
1.需要压缩存储的矩阵可分为
矩阵和
矩阵两种。
答案:特殊矩阵稀疏矩阵
分析:关于矩阵的压缩存储方法,根据矩阵的特点分为特殊矩阵和稀疏矩
阵。特殊矩阵要求进行压缩存储时保持其随机存取特性不变,而稀疏矩阵
则会失去随机存取功能。
2.设数组A[0..8,1..10],数组中任一元素A[i,j]均占内存48个二进制位,
图5.6
稀疏矩阵A的十字链表
4.画出下列广义表的图形表示。
(1)A(a,B(b,d),C(e,B(b,d),L(f,g,h)))
(2)A(a,B(b,A))
分析与解答:
(1)A(a,B(b,d),C(e,B(b,d),L(f,g,h)))的图形表示如图5.7(a)所示。
(2)A(a,B(b,A))的图形表示如图5.7(b)所示。
出LS中的元素e的运算是

A.GetHead(GetTail(LS)) B.GetHead(GetTail(GetTail (GetHead
(LS))))
C.
GetTail (GetHead (LS))
D.GetHead(GetTail(GetHead(GetTail(LS))))
分析:本题的解答过程要应用排除法,分别对A、B、C、D选项进行计算并
若以行序为主序顺序存储,则元素A[45,68]的存储地址为(1)
;
若以列序为主序顺序存储,则元素A[45,68]的存储地址为(2)

答案:(1)9174 (2)8878
分析:本题主要考查计算某元素的存储地址,注意区分按行为主序和以列
为主序的存储方式。
(1)A[45,68]的存储地址=2000+((45-1)*80+67)*2=9174;
a00
a01 a10 a11
a12 …… an-2,n-3 an-2,n-2
an-2,n-1 an-1,n-2
an-1,n-1
第0行第1行第n-2行第n-1行
(1)元素的二维下标(i,j)与一维向量中的位置k的对应关系为:
k=3*i-1+j-i+1=2*i+j
(2)一维向量中的位置k与元素的二维下标(i,j)的对应关系为:
应为10*(1+1+1)*2+3*2=66。答案应选择D。
二判断题
1.稀疏矩阵压缩后,必会失去随机存取功能。
正确
分析:具有存取任一个元素的时间相等这一特点的存储结构称为随机存取结
构。对稀疏矩阵压缩存储所用的存储结构是三元组表或十字链表。十字链
表因其链表结构而不能随机存取;而使用三元组表存储矩阵时,若要访问

A. 1和1 B. 1和3 C. 1和2 D. 2和3
i(i+1)/2+j+1ij
k=
j(j+1)/2+i+1i<j
分析:该题目主要考查广义表的长度和深度的基本概念,广义表的长度是
广义表中层次为1的元素个数,而广义表的深度是指广义表展开后所含括
号的层数。因此本题中的L的长度为1,L的深度为2。答案应选择C。
i=int((k+2)/3), j=k-2*i
2.假设一个准对角矩阵:
a11 a12
a21 a22
a33 a34
a43 a44
….
aij
a2m-1,2m-1 a2m-1,2m
a2m,2m-1 a2m,2m
按以下方式存储于一维数组B[4m]中:
0 1
2 3 4
5 6 … k …
4m-1 4m
a11 a12 a21 a22 a33 a34 a43 … aij … a2m-1,2m a2m,2m-1 a2m,2m
(2)A[45,68]的存储地址=2000+((68-1)*50+44)*2=8788。
4.设广义表L=((),()),则GetHead(L)是
;GetTail(L)

;L的长度是
;L的深度


答案:() (()) 2 2
分析:对于广义表LS=(a1,a2,a3,…,an),各个运算如下:
表头:GetHead(LS)=a1
量B[0..3n-3]中,使得B[k]=aij,求:
(1)用i,j表示k的下标变换公式;
(2)用k表示i,j的下标变换公式;
分析与解答:三对角矩阵为A为
0001
101112
2,32,22,1
1,21,1
nnnnnn
nnnn aa
aaa
aaa
aa
将其按行存储到向量B中,得到的存储形式如下:
LOC(B[0]) …… LOC(B[3n-3])
错误。答案应选择C。
2.一维数组A采用顺序存储结构,每个元素占用6个字节,第6个元素
的起始地址为100,则该数组的首地址是

A.64 B.28 C.70 D.90
分析:设数组元素的首地址为x,则存在关系x+5*6=100,因此x为70,答
案应选择C。
3.稀疏矩阵采用压缩存储的目的主要是______________。

当为原

当为子

DepthLS
设计语言的(2)
来表示。
答案:(1)原子元素或广义表(2)联合或共同体
分析:根据广义表定义,广义表中的元素,即可以是原子元素,也可以是
广义表。因此其描述应采用程序设计语言的联合或共同体来表示。
6.设某广义表H=(A,(a,b,c)),运用GetHead函数和GetTail函数求出广
表尾:GetTail(LS)= (a2,a3,…,an)
长度:Length(LS)=n
深度:
故答案为:GetHead(L)=();GetTail(L)=(());L的长度为2;L的深度为
2。
5.广义表中的元素,可以是(1)
,所以其描述宜采用程序1LS
()0LS
1+MAX{Depth(ai)|i=1,2,...,n}LS当为空
写出由一对下标(i,j)求k的转换公式。
分析与解答:将准对角矩阵看成是对角线元素为矩阵的对角矩阵。
11
0
0 mm A
A
首先计算出aij所处在对角矩阵Amm中的位置,计算公式为int((i-1)/2),
int()为取整操作。则int((i-1)/2)*4为对角矩阵所处在一维数组B中的
位置。
其次计算aij的所处在的对角矩阵Amm中的相对位置。
2 2 3 1
3 2 6 -1
4 4 3 2
5 5 5 4
6稀疏矩阵行数
6稀疏矩阵列数
6稀疏矩阵非零
元素个数
图5.5稀疏矩阵A的三元组表
(2)十字链表法实际上是采用链式存储结构表示三元组表。在链表中,每个
非零元可用一个含有五个域的结点表示。其存储结构定义如图5.2所示。
稀疏矩阵A所对应的十字链表存储结构如图5.6所示。
(2)画出其十字链表形成的压缩存储表。
相关文档
最新文档