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

压缩存储方法:只需要存储下三角 (含对角线)上的元素。可节省一 半空间。
可以使用一维数组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中列号
一、三元组顺序表
对于稀疏矩阵,非零元可以用三元组表示, 整个稀疏矩阵可以表示为所有非零元的三元组所 构成的线性表。例如:
第五章数组和广义表

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

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

第五章数组和广义表讲课提要【主要内容】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。
数据结构第5章数组与广义表

一个稀疏矩阵里存在大量的零元素,若 以常规方法,即以二维数组来存储稀疏矩 阵时产生如下问题: 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
《数据结构》第5章数组和广义表.ppt

28
28
5.3.2(续)三元组顺序表上的转置(二)
2019/12/8
9
9
5.3 矩阵的压缩存储
压缩存储:为多个值相同的非零元素只分 配一个存储空间;对零元素不分配空间。
2019/12/8
10
10
5.3.1特殊矩阵的压缩存储
特殊矩阵:非零元素按照一定的规律分布。
常见的特殊矩阵有对称矩阵、三角矩阵、对角矩 阵等。 对称矩阵:元素的值按照主对角线对称
列优先顺序——先排最左下标,从右向左, 最后排最左下标。
例如:三维数组Am*n*p以行优先方式顺序 存储,则 LOC(aijk)=LOC(a111)+[(i-1)*m*n+ (j-1)*n+(k-1)]*d
2019/12/8
8
8
数组存储的特点
只要知道开始结点的存放地址(即基地址)、维 数和每维的上、下界,以及每个数组元素所占用 的单元数,就可以将数组元素的存放地址表示为 其下标的线性函数。因此,数组中的任一元素可 以在相同的时间内存取,即顺序存储的数组是一 个随机存取结构。
二维数组A可以看成是由m个行向量组成的向量, 也可以看成是n个列向量组成的向量。
数组一旦被定义,它的维数和维界就不再改变。 因此,除了结构的初始化和销毁之外,数组只 有存取元素和修改元素值的操作。
2019/12/8
4
4
5.2 数组的顺序表示
由于计算机的内存结构是一维的,因此用一维 内存来表示多维数组,就必须按某种次序将数 组元素排成一列序列,然后将这个线性序列存 放在存储器中。
数组一旦建立,结构中的元素个数和元素间的 关系就不再发生变化。因此,一般采用顺序存 储的方法来表示数组。
第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章-数组和广义表

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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图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)画出其十字链表形成的压缩存储表。