chap5数组和广义表

合集下载

第5章数组和广义表PPT课件

第5章数组和广义表PPT课件
A、j(j-1)/2+i-1 B、j(j-1)/2+i C、j(j+1)/2+i-1 D、 j(j+1)/2+i
数据结构(Java版)》叶核亚
5.2.2 稀疏矩阵的压缩存储
表示稀疏矩阵的三元组
0 0 11 0 17 0
0
20
0
0
0
0
行号 row
列号 column
元素值 value
A56
0 19
设矩阵A是一个对称矩阵,为了节省空间,将其下三角部分 按行优先存放在一维数组B中。对下三角矩阵中任一元素 aij(i>=j,j>=1),在一维数组B中下标K的值是:
A、i(i-1)/2+j-1 B、i(i-1)/2+j C、i(i+1)/2+j-1 D、 i(i+1)/2+j
设矩阵A是一个对称矩阵,为了节省空间,将其上三角部分 按列优先存放在一维数组B中。对上三角矩阵中任一元素 aij(i<=j,i>=1),在一维数组B中下标K的值是:
1.多维数组的逻辑结构
数据结构(Java版)》叶核亚
5.1.2 多维数组
2.多维数组的遍历
(1)行优先次序
a1,1 a1,2 a1,n
Amn
a2,1
am,1
a2,2 am,2
a2,n
am,n
a1,1,a1,2,…,a1,n,a2,1,a2,2,…, a2,n,…,am,1,am,2,…,am,n
常见的广义表为:
L=(a,b)
//线性表,长度为2 ,深度为1
T=(c,L)=(c,(a,b)) //L为T的子表,T的长度为2 , 深度为2

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

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

中的元素均为常数。下三角矩阵正好相反,它的主对
数据结构讲义
第5章 数组与广义表
—数组
数组和广义表
数组和广义表可看成是一种特殊的 线性表,其特殊在于,表中的数据 元素本身也是一种线性表。
几乎所有的程序设计语言都有数组 类型。本节重点讲解稀疏矩阵的实 现。
5.1 数组的定义
由于数组中各元素具有统一的类型,并且 数组元素的下标一般具有固定的上界和下 界,因此,数组的处理比其它复杂的结构 更为简单。
nm
aa1221
aa2222
…………....
aam2n2 ………………..
aamm11 aamm22 ………….... aammnn LLoocc(a( iaj)ij=)L=Loco(ca(a111)1+)[+([j(-i1-)1m)n++((i-j1-1)])*]*l l
aa1mn 1 aa2mn2 …………....
其存储形式如图所示:
15137 50800 18926 30251
a00 a10 a 11 a20 a21 a23 ………………..
70613
an-1 0 a n-1 1 a n-1 2 …a n-1 n-1
图 5.1 对称矩阵
在这个下三角矩阵中,第i行恰有i+1个元素,元素总
数为:
n(n+1)/2
5.2 数组的顺序表示和实现
由于计算机的内存结构是一维的,因此用 一维内存来表示多维数组,就必须按某种 次序将数组元素排成一列序列,然后将这 个线性序列存放在存储器中。
又由于对数组一般不做插入和删除操作, 也就是说,数组一旦建立,结构中的元素 个数和元素间的关系就不再发生变化。因 此,一般都是采用顺序存储的方法来表示 数组。

《数据结构——用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.1 多维数组5.1.1 数组的逻辑结构数组是我们很熟悉的一种数据结构,它可以看作线性表的推广。

数组作为一种数据结构其特点是结构中的元素本身可以是具有某种结构的数据,但属于同一数据类型,比如:一维数组可以看作一个线性表,二维数组可以看作“数据元素是一维数组”的一维数组,三维数组可以看作“数据元素是二维数组”的一维数组,依此类推。

图5.1是一个m行n 列的二维数组。

标识,因此,在数组上不能做插入、删除数据元素的操作。

通常在各种高级语言中数组一旦被定义,每一维的大小及上下界都不能改变。

在数组中通常做下面两种操作:(1)取值操作:给定一组下标,读其对应的数据元素。

(2)赋值操作:给定一组下标,存储或修改与其相对应的数据元素。

我们着重研究二维和三维数组,因为它们的应用是广泛的,尤其是二维数组。

5.1.2 数组的内存映象现在来讨论数组在计算机中的存储表示。

通常,数组在内存被映象为向量,即用向量作为数组的一种存储结构,这是因为内存的地址空间是一维的,数组的行列固定后,通过一个映象函数,则可根据数组元素的下标得到它的存储地址。

对于一维数组按下标顺序分配即可。

对多维数组分配时,要把它的元素映象存储在一维存储器中,一般有两种存储方式:一是以行为主序(或先行后列)的顺序存放,如BASIC、PASCAL、COBOL、C等程序设计语言中用的是以行为主的顺序分配,即一行分配完了接着分配下一行。

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

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

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

完整word版数据结构数组和广义表习题及答案

完整word版数据结构数组和广义表习题及答案

习题五数组和广义表一、单项选择题1.常对数组进行的两种基本操作是()A.建立与删除B. 索引与修改C. 查找与修改D. 查找与索引2.对于C语言的二维数组DataType A[m][n],每个数据元素占K个存储单元,二维数组中任意元素a[i,j] 的存储位置可由( )式确定.A.Loc[i,j]=A[m,n]+[(n+1)*i+j]*kB.Loc[i,j]=loc[0,0]+[(m+n)*i+j]*kC.Loc[i,j]=loc[0,0]+[(n+1)*i+j]*kD.Loc[i,j]=[(n+1)*i+j]*k3.稀疏矩阵的压缩存储方法是只存储 ( )A.非零元素B. 三元祖(i,j, aij)C. aijD. i,j4. 数组A[0..5,0..6]的每个元素占五个字节,将其按列优先次序存储在起始地址为1000的内存单元中,则元素A[5,5]的地址是( )。

A. 1175B. 1180C. 1205D. 12105. A[N,N]是对称矩阵,将下面三角(包括对角线)以行序存储到一维数组T[N(N+1)/2]中,则对任一上三角元素a[i][j]对应T[k]的下标k是()。

A. i(i-1)/2+jB. j(j-1)/2+iC. i(j-i)/2+1D. j(i-1)/2+16. 用数组r存储静态链表,结点的next域指向后继,工作指针j指向链中结点,使j 沿链移动的操作为( )。

A. j=r[j].nextB. j=j+1C. j=j->nextD. j=r[j]-> next7. 对稀疏矩阵进行压缩存储目的是()。

A.便于进行矩阵运算 B.便于输入和输出C.节省存储空间 D.降低运算的时间复杂度8. 已知广义表LS=((a,b,c),(d,e,f)),运用head和tail函数取出LS中原子e的运算是( )。

A. head(tail(LS))B. tail(head(LS))C. head(tail(head(tail(LS)))D. head(tail(tail(head(LS))))9. 广义表((a,b,c,d))的表头是(),表尾是()。

第5章数组和广义表答案

第5章数组和广义表答案

第5章数组和广义表答案第 5 章数组和广义表一、选择1.设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为( B )。

A. 13B. 33C. 18D. 402. 设有数组A[i,j],数组的每个元素长度为3字节,i的值为1 到8 ,j的值为1 到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为(B )。

A. BA+141B. BA+180C. BA+222D. BA+2253. 假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=( B )。

A. 808B. 818C. 1010D. 10204. 二维数组A的元素都是6个字符组成的串,行下标i的范围从0到8,列下标j的范围从0到9。

从供选择的答案中选出应填入下列关于数组存储叙述中()内的正确答案。

(1)存放A至少需要( E )个字节;(2)A的第8列和第5行共占( A )个字节;(3)若A按行存放,元素A[8,5]的起始地址与A按列存放时的元素( B )的起始地址一致。

供选择的答案:(1)A. 90 B. 180 C. 240 D. 270 E. 540(2)A. 108 B. 114 C. 54 D. 60 E. 150 (3)A. A[8,5] B. A[4,9]C. A[5,8]D. A[0,9]5. 若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中,则在B中确定aij(i<="" b="" p="">A. i*(i-1)/2+jB. j*(j-1)/2+iC. i*(i+1)/2+jD. j*(j+1)/2+i6. A[N,N]是对称矩阵,将下面三角(包括对角线)以行序存储到一维数组T[N(N+1)/2]中,则对任一上三角元素a[i][j]对应T[k]的下标k是( B )。

第五章数组和广义表

第五章数组和广义表
TransposeSMatrix ( M, &T )
稀疏矩阵M存在
由稀疏矩阵M复制 得到T
稀疏矩阵M与N的行 求稀疏矩阵的和Q 数和列数对应相等 =M+N
稀疏矩阵M与N的行 求稀疏矩阵的差Q 数和列数对应相等 =M-N
稀疏矩阵M的列数 求稀疏矩阵乘积Q
等于N的行数
=M*N
稀疏矩阵M存在
求稀疏矩阵M的转 置矩阵T
M.chead
M.rhead
30 05
113
145
M = 0 -1 0 0
2 000
2 2 -1
312
稀疏矩阵的十字链表存储表示:
typedef struct OLNode { int i, j ; // 非零元的行和列下标 ElemType e ; Struct OLNode *right, *down ; // 该非零元所在行表和列表的后继链域
1 当i

j
a00 a10 a11 a20 k= 0 1 2 3
… an-1, 0 … n(n-1)/2
an-1, n-1 n(n+1)/2-1
ADT SparseMatris { 数据对象:
D = { aij | i = 1, 2, …, m; j =1, 2, … , n; aij∈ElemSet,m和n分别称为矩阵的行数和列数}
第五章 数组和广义表
ADT Array { 数据对象:{ ji = 0, … , bi-1 , i = 1, 2 , … ,
n, D = { aj1j2…jn | n ( > 0 )称为数组的维数, bi是数组第i维的长度, ji是数组元素的第i维下标, aj1j2…jn∈ElemSet } 数据关系:R = { R1, R2, …, Rn }

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

Chap5 数组与广义表

Chap5 数组与广义表

15 0 0 -7 0 0 0
随机稀疏矩阵的压缩存储方法:
一、三元组顺序表 二、 十字链表
一、三元组顺序表
对于非零元素在矩阵中随机出现的稀疏矩 阵,则在存储非零元素的同时,还必须存储该 非零元素在矩阵中所处的行号和列号。我们将 这种存储方法叫做稀疏矩阵的三元组表示法。
每个非零元素在一维数组中的表示形式 如图所示:
0 12 9 0 0 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 14 0
M6 × 7 =
0 0 24 0 0 0 0
N7×6=
0 18 0 0 0 0 0
15 0 0 -7 0 0 0
0 12 9 0 0 0 0
0 0 0 0 0 0 0
-3 0 0 0 0 18 0 24 0 0 0 0 0 0 0 14 0 0 0 0 0
5.2 数组的顺序表示和实现
类型特点: 1)对于数组A,一旦给定其维数n及各维长度bi (1≤i≤n),则该数组中元素的个数是固定的, 不能对数组做插入和删除操作,不涉及移动元素 操作,因此数组采用顺序存储比较合适; 2) 数组是多维的结构,而存储空间是 一个一维 的结构, 因此有存储次序的约定问题。
L
二维数组Am*n中任一元素ai,j 的存储位置
LOC(i,j)=LOC(1,1) + (m×(j-1)+(i-1))×L
称为基地址或基址。
例:设有二维数组A[10][20],其每个元 素占2个字节,第一个元素A1,1的存储地址 为100,则按行优先顺序存储时元素A6,6的 存储地址为 A 6,6=100+[(6-1)*20+(6-1)]*2=310

ai2 ┇

i ┇ m
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档