第5章 多维数组和广义表

合集下载

第五章 数组和广义表

第五章 数组和广义表

矩阵Am×n看成n个列向量的线性表,即j=(a1j,a2j, …,amj)
还可以将数组Am×n看成另外一个线性表:
B=(1,,2,,… i ,…,m),其中i(1≤i≤m) 本身也是一个线性表,称为行向量,即: i= (ai1,ai2, …,aij ,…,ain)。 B ‖ 1 … i … m
5.3.1 特殊矩阵
• 三类特殊矩阵: 1. 对称矩阵:若 n 阶方阵A中的元满足特性 aij =aji 1≤i,j≤n 则称为 n 阶对称矩阵; 2. 2. 三角矩阵:若 n 阶方阵中下(上)三角(不包括对 角线)中的元均为常量 c 或 0,则称为上(下)三角矩 阵; 3. 3. 对角矩阵:若n阶方阵中的非零值元都集中在以主 对角线为中心的(由k条对角线组成的)带状区域中, 则称为k对角矩阵。
三维数组A中任一元素ai,j,k 的存储位置
a0,0,0 a0,0,1 a0,0,2 a0,1,0 a0,1,1 a0,1,2 a1,0,0 a1,0,1 a1,0,2 a1,1,0 a1,1,1 a1,1,2
Loc(ai,j,k)=Loc(a0,0,0)+(b2*b3* i+b3* j+k)* L
a11 a12 … a1,n a21 a22 … a2,n … an,1 an,2 … ann
k=0 1 …………………………… n(n-1)/2 n(n+1)/2-1
a11 a12 … a1,j … a1,n
An*n=
a21 a22 … a2,j … a2,n
ai-1,1 ai-2,2…ai-1,j …ai-1,n ai,1 ai,2 … ai,j … ai,n
5.3 矩阵的压缩存储
• 压缩存储:为多个值相同的元素只分配一个存 储空间,对零元素不分配空间。 • 目的:节省存储空间 • 任务:压缩存储矩阵并使矩阵的运算有效进行。 • 矩阵的存储:二维数组 • 可压缩存储的矩阵有两类: – 特殊矩阵:值相同的元素或零元素在矩阵中 分布有一定规律。如三角矩阵、对角矩阵。 – 随机稀疏矩阵:值相同的元素或零元素在矩 阵中分布没有一定规律。

数据结构第五章

数据结构第五章
2012年11月1日 13
2.三角矩阵 (1)上三角矩阵 即矩阵上三角部分元素是随机的,而下三角部分元素全部 相同(为某常数C或全为0),具体形式见图5-2(a)。 (2)下三角矩阵 即矩阵的下三角部分元素是随机的,而上三角部分元素全 部相同(为某常数C或全为0),具体形式见图5-2(b)。
2012年11月1日
2012年11月1日
12
5.3.1 特殊矩阵
2 3 1 A= 5 4 2 4 6 3
图5-1 一个对称矩阵
1.对称矩阵 若一个n阶方阵A中元素满足下列条件: aij=aji 其中0≤i, j≤n-1,则称A为对称矩阵。 例如,如图5-1所示是一个3×3的对称矩阵。
0
1
2
3
4
5
6
7
……
n ( n +1 ) 2
-3
n ( n +1 ) 2
-2
n ( n +1 ) -1 2
a00 a01 a02 a03 a04 a05 a06 a07
……
an-2n-2
an-2n-1
an-1n-1
2012年11月1日
(b)上三角矩阵的压缩存储形式 图5-5 对称矩阵及用上三角压缩存储
第5章 多维数组和广义表
本章学习内容
5.1 多维数组
5.2 多维数组的存储结构
5.3 特殊矩阵及其压缩存储
5.4 稀疏矩阵
5.5 广义表
2012年11月1日 1
5.1 多维数组
5.1.1 多维数组的概念
1.一维数组
一维数组可以看成是一个线性表或一个向量(第2章中 已经介绍),它在计算机内是存放在一块连续的存储 单元中,适合于随机查找。

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

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

中国农业大学_821数据结构_《数据结构》习题(5)

中国农业大学_821数据结构_《数据结构》习题(5)

三、算法题
1. 编写一个函数,将A[0..n-1]中所有奇数移到偶数之前。要求不另增加存储空间,且
时间复杂度为O(n)。 2. 编写一个函数,设置mn(m=2,n=3)矩阵的元素后,统计这个矩阵中具有下列特 征的元素个数并输出它们的坐标和数值:它们既是所在行中的最小值又是所在列中的最小 值,或者它们既是所在行中的最大值又是所在列中的最大值。 3. 编写一个函数,在nn(n≥3)的稀疏矩阵A中,只有下标满足1<i<n和n-i≤j≤n-i+2 的元素A[i][j]不等于0 ,若这些非 0 元素按行优先的顺序存储在一维数组 B 中,试通过 B 求 A[i][j]之值。也就是说,在存在B的情况下,已知i、j求A[i][j]。 4. 编写一个函数,假设稀疏矩阵A和B(分别为)mn和nk采用三元组表示,试计算 C=A*B,要求C也是采用稀疏矩阵的三元组表示。 5. 编写一个函数,计算一个广义表原子结点个数。例如一个广义表为 (a, (b, c), ((e))), 其原子结点的个数为4。 6. 编写一个函数,计算一个广义表的所有原子结点数据域(数据域为整数型)之和。 例如一个广义表为 ((3, 4), 5, (( 6, 3 ))),其所有结点数据域之和为21。 7. 编写一个函数,将两个广义表合并成一个广义表,合并是指元素的合并。例如两个 广义表 ((a, b), (c)) 与 (a, (e, f)) 合并后的结果是 ((a, b), (c), a, (e, f))。 8. 编写一个函数,删除广义表中所有值为x的元素。例如删除广义表 ((a, b), a, (d, a)) 中所有a的结果空题
1. 已知二维数组A[m][n]采用行序为主方式存储,每个元素占k个存储单元,并且第一 个元素的起始地址始LOC(A[0][0]),则A[i][j]的地址是 。

《数据结构与算法》第五章-数组和广义表学习指导材料

《数据结构与算法》第五章-数组和广义表学习指导材料

《数据结构与算法》第五章数组和广义表本章介绍的数组与广义表可视为线性表的推广,其特点是数据元素仍然是一个表。

本章讨论多维数组的逻辑结构和存储结构、特殊矩阵、矩阵的压缩存储、广义表的逻辑结构和存储结构等。

5.1 多维数组5.1.1 数组的逻辑结构数组是我们很熟悉的一种数据结构,它可以看作线性表的推广。

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

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

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

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

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

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

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

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

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

例如一个2×3二维数组,逻辑结构可以用图5.2表示。

以行为主序的内存映象如图5.3(a)所示。

分配顺序为:a11 ,a12 ,a13 ,a21 ,a22,a23 ; 以列为主序的分配顺序为:a11 ,a21 ,a12 ,a22,a13 ,a23 ; 它的内存映象如图5.3(b)所示。

第5章演示

第5章演示

对称矩阵的压缩存储
(2)压缩存储: ③数组Sa中的元素与矩阵元素aij存在着一一对应的 关系。 假设数组元素Sa[k]中存放的是矩阵元素aij,则它们 之间的对应关系实质上就是下标值k和i、j之间的对应 关系。
对称矩阵的压缩存储的下标转换公式为:
i(i-1)/2+(j-1),当i>=j k= j(j-1)/2+(i-1),当i<j
稀疏矩阵
3、稀疏矩阵的存储结构 (2)算法:将矩阵M转置为矩阵T
M.data M.data[1] 1 2 12 M.data[2] 1 3 9 M.data[3] 3 M.data[4] 3 M.data[5] 4 M.data[6] 5 M.data[7] 6 M.data[8] 6 1 6 3 -3 14 24 T.data T.data[1] 1 3 -3 T.data[2] 1 6 15
稀疏矩阵的三元组表表示法节约了存储空间, 实现了压缩存储。
稀疏矩阵
注意:
稀疏矩阵 唯一 三元组表
不唯一
解决办法:在三元表的基础上,再引入总行数、 总列数和非零元素总个数即可。
稀疏矩阵
3、稀疏矩阵的存储结构 (1)三元组顺序表 以顺序存储结构表示的三元组表。 三元组类型定义: typedef struct { int i,j; elemtype e; }Triple;
5.4 广义表的定义
二、表示 (1)用关系定义表示; (2)用图表示。 说明: ①广义表是一个多层次结构; ②广义表之间可以共享; ③广义表可以递归定义; ④表头可以为原子或子表;表尾只能为子表; ⑤( )与( ( ) )不同。
5.4 广义表的定义 A =( ) B =(e) C =(a, (b,c,d)) D =(A, B, C) E =(a, E) F =(( ))

中南大学数据结构与算法第5章数组和广义表课后作业答案

中南大学数据结构与算法第5章数组和广义表课后作业答案

第5章数组与广义表习题练习答案5.1请按行及按列优先顺序列出四维数组A2*3*2*3的所有元素在内存中的存储次序,开始结点为a0000。

解:按行优先的顺序排列时,先变化右边的下标,也就是右到左依次变化,这个四维数组的排列是这样的:(将这个排列分行写出以便与阅读,只要按从左到右的顺序存放就是在内存中的排列位置) a0000a0001a0002a0010a0011a0012a0100a0101a0102a0110a0111a0112a0200a0201a0202a0210a0211a0212a1000a1001a1002a1010a1011a1012a1100a1101a1102a1110a1111a1112a1200a1201a1202a1210a1211a1212按列优先的顺序排列恰恰相反,变化最快的是左边的下标,然后向右变化,所以这个四维数组的排列将是这样的,(这里为了便于阅读,也将其书写为分行形式):a0000a1000a0100a1100a0200a1200a0010a1010a0110a1110a0210a1210a0001a1001a0101a1101a0201a1201a0011a1011a0111a1111a0211a1211a0002a1002a0102a1102a0202a1202a0012a1012a0112a1112a0212a02125.2 给出C语言的三维数组地址计算公式。

解:因为C语言的数组下标下界是0,所以Loc(A mnp)=Loc(A000)+((i*n*p)+k)*d其中Amnp表示三维数组。

Loc(A000)表示数组起始位置。

i、j、k表示当前元素的下标,d表示每个元素所占单元数。

5.3设有三对角矩阵A n*n,将其三条对角线上的元素逐行地存储到向量B[0...3n-3]中,使得B[k]=a ij,求:(1)用i , j 表示k的下标变换公式。

(2)用k 表示i,j 的下标变换公式。

多维数组与广义表

多维数组与广义表


假设数组各维的下界是1,按“行优先顺序”存储,假
设每个元素占用d个存储单元。
二维数组Amn, aij的地址计算函数为:
LOC(aij)=LOC(a11)+[(i-1)*n+j-1]*d
三维数组Amnp,aijk的地址计算函数为:
LOC(aijk)=LOC(a111)+[(i-1)*n*p+(j-1)*p +(k-1)]*d
5.2 矩阵的压缩存储
在编程时,简单而又自然的方法,是将矩阵描述为
一个二维数组。矩阵在这种存储表示之下,可以对 其元素进行随机存取。
但是在一些特殊矩阵中,非零元素呈某种规律分布
或者矩阵中有大量的零元素,如果仍用二维数组存, 会造成极大的浪费,尤其是处理高阶矩阵的时候。
为了节省存储空间, 我们可以对这类矩阵进行压缩
最基本的原理
Ai1…in的起始地 址 第一个元素 该元素前面 单位 = 〸 ╳ 的起始地址 的元素个数 长度
程序员试题
2006-1
对于二维数组a[0…4,1…5],设每个元素占1个存储单
元,且以行为主序存储,则元素a[2,1]相对于数组空 间起始地址的偏移量是___(40)___。 (40)A.5 B.10 C.15 D.25
2001
二维数组 X 的行下标范围是0~5,列下标范围是1~8,每

个数组元素占六个字节,则该数组的体积为__(6)__个字节, 若已知 X 的最后一个元素的起始字节地址为382,则 X 的 首地址(即第一个元素的起始字节地址)为 __(7)__,记为 Xd 。若按行存储,则 X{1,5] 的起始地址是 __(8)__, 结束字节 地址是 __(9)__。若按列存储,则 X[4,8]的起始字节地址为 __(10)__。 (6): A.210 B.240 C.288 D.294 (7): A.0 B.6 C.94 D.100 (8): A.Xd+24 B.Xd+72 C.Xd+78 D.Xd+144 (6)C (7)D (8)B (9)B (10)D (9): A.Xd+29 B.Xd+77 C.Xd+83

02331《数据结构》自考——各章要点

02331《数据结构》自考——各章要点

自考《数据结构》各章要点一第一章概论数据就是指能够被计算机识别、存储和加工处理的信息的载体。

数据元素是数据的基本单位,可以由若干个数据项组成。

数据项是具有独立含义的最小标识单位。

数据结构的定义:·逻辑结构:从逻辑结构上描述数据,独立于计算机。

·线性结构:一对一关系。

·线性结构:多对多关系。

·存储结构:是逻辑结构用计算机语言的实现。

·顺序存储结构:如数组。

·链式存储结构:如链表。

·稠密索引:每个结点都有索引项。

·稀疏索引:每组结点都有索引项。

·散列存储结构:如散列表。

·对数据的操作:定义在逻辑结构上,每种逻辑结构都有一个运算集合。

·常用的有:检索、插入、删除、更新、排序。

·数据类型:是一个值的集合以及在这些值上定义的一组操作的总称。

·原子类型:由语言提供。

·结构类型:由用户借助于描述机制定义,是导出类型。

抽象数据类型ADT:·是抽象数据的组织和与之的操作。

相当于在概念层上描述问题。

·优点是将数据和操作封装在一起实现了信息隐藏。

程序设计的实质是对实际问题选择一种好的数据结构,设计一个好的算法。

算法取决于数据结构。

算法是一个良定义的计算过程,以一个或多个值输入,并以一个或多个值输出。

评价算法的好坏的因素:·算法是正确的;·执行算法的时间;·执行算法的存储空间(主要是辅助存储空间);·算法易于理解、编码、调试。

时间复杂度:是某个算法的时间耗费,它是该算法所求解问题规模n的函数。

渐近时间复杂度:是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。

评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度。

算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。

时间复杂度按数量级递增排列依次为:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n^2)、立方阶O(n^3)、……k次方阶O(n^k)、指数阶O(2^n)。

数据结构(C语言)第五章

数据结构(C语言)第五章

假设以一维数组sa[0..n(n+1)/2-1]作为n阶对称矩阵A的
存储结构,则sa[k]和矩阵元aij之间存在着一一对应的关系。
0
1
2
3
4
5
6
7
8
……
n(n+1)/2-1
sa a00 a10 a11 a20 a21 a22 a30 a31 a32
an-1n-1
27
若i≥j,则aij在下三角形中。aij之前的i行(从第0 行到第i-1行)共有1+2+…+i=i*(i+1)/2个元素,在第i行 上,aij之前恰有j个元素(即ai0,ai1,…,ai,j-1 ),因此aij之 前共有k个元素:
=2000+(3*4+2)*4 =2056
21
例2:二维数组A中,每个元素的长度为3个字节,行下标i 从0到7,列下标j从0到9,从首地址SA开始存放在存储 器内,该数组按列存放时,元素A[4][7]的起始地址 为 。
A. SA+141 C. SA+222 B. SA+180 D. SA+225
解:LOC(a47)=LOC(a00)+(j *m+ i)*L = SA+(7*8+4)*3

以行序为主序(行优先顺序) 以列序为主序(列优先顺序)
13
一、以行序为主序:
1.存放规则 行优先顺序也称为低下标优先或右边下标优先于左 边下标。具体实现时,按行号从小到大的顺序,先将第 一行中元素全部存放好,再存放第二行元素,第三行元 素,依次类推……
BASIC语言、PASCAL语言、C/C++语言都是按行优先

第5章 数据结构 多维数组和广义表

第5章 数据结构 多维数组和广义表

按列优先存储的寻址方法与此类似。
数据结构(C版)
广义线性表——多维数组
数组的存储结构与寻址——多维数组
n(n>2)维 数组一般也采用 按行优先和按列 优先两种存储方 法。请自行推导 任一元素存储地 址的计算方法。 Loc(aijk ) = Loc(a000) +( i×m2×m3 + j×m3 + k )×c
如何压缩存储?
只存储上三角(或下三角)部分的元素。
数据结构(C版)
a00 a10 a 20 a30
a01 a11 a21 a31
a02 a12 a22 a32
a03 a13 a23 a33
上 三 角 矩 阵
a00 a01 a02 a10 a11 a12 a a a 20 21 22
(a) 三对角矩阵
按行 存储
元素aij在一维数组中的序号 =2 + 3(i-1)+( j-i + 1)+1 =2i+ j+1 ∵一维数组下标从0开始 ∴元素aij在一维数组中的下标 =2i+ j (b) 寻址的计算方法
0
1
2
3
4
5
6
7
8
9 10
11 12
a00 a01 a10 a11 a12 a21 a22 a23 a32 a33 a34 a43 a44
数组——线性表的推广
a11 a21 … am1 a12 a22 … am2 … … … … a1n a2n … amn
A=(A1,A2,……,An)
其中: Ai=(a1i,a2i,……,ami) (1≤i≤n)
A=
二维数组是数据元素为线性表的线性表。

大学数据结构课件--第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 ) ( ( ( (
① 数组中的元素都具有统一的类型; ② 数组元素的下标一般都具有固定的上界和下界,即数组一旦 被定义,它的维数和维界就不再发生改变; ③ 数组的基本操作简单:初始化、销毁、存取元素和修改元素值

数据结构数组和广义表

数据结构数组和广义表

数据结构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.3.1
特殊矩阵
1、对称矩阵 在一个n阶方阵A中,若元素满足下述性质: aij = aji 1≤i,j≤n 则称A为对称矩阵。 a11 1 5 1 3 7 a21 a 22 5 0 8 0 0 a31 a32 a33 1 8 9 2 6 ……………….. 3 0 2 5 1 an 1 a n 2 a n 3 …a n n 7 0 6 1 3
第5章
数组和广义表
5.1 数组的定义
5.2 数组的顺序表示和实现
5.3 矩阵的压缩存储
5.3.1 特殊矩阵
5.3.2 稀疏矩阵
5.4 广义表的定义
5.1 数组的定义
数组-----线性表的扩展 A =(a0,a1,a2,…,an-1)
a00 a10 ┇ Am×n= ai0 ┇ am-1,0 a01 … a0j … a11 … a1j … ┇ ai2 … aij … ┇ am-1,2 … am-1,j … a0,n-1 a1,n-1 ai,n-1 am-1,n-1 α0 α1 ┇ Am×n= α i ┇ α m-1
Assign( &A, e, index1, ..., indexn) 赋值操作 初始条件:A是n维数组,e为元素变量,随后是n个下标值。 操作结果:若下标不超界,则将e的值赋给所指定的A的元 素,并返回OK。 对于数组来说一旦维数确定了,每个元素的下标确定了, 那么整个数组就确定了,这样的一个数组结构除了能改变 某元素的值,其他的不能再改变。
5.2 数组的顺序表示和实现
数组类型特点: 1) 只有引用型操作,没有加工型操作; 2) 数组是多维的结构,而存储空间是一个一维的结构。 有两种顺序映象的方式。
有两种顺序映像方法: 1)以行序为主序(行优先,先行后列):先存储行号较小 的元素,行号相同者先存储列号较小的元素;

数据结构5

数据结构5

重点和难点
重点是学习数组类型的定义及其存储表示. 重点是学习数组类型的定义及其存储表示. 数组类型的定义及其存储表示
知识点
数组的类型定义,数组的存储表示,特殊矩阵的压缩存储表示方法, 数组的类型定义,数组的存储表示,特殊矩阵的压缩存储表示方法, 随机稀疏矩阵的压缩存储表示方法. 随机稀疏矩阵的压缩存储表示方法.
A m×n m×n
a 00 a 10 = ... a m-1,0
a 01 a11 ...
a 02 a12 ...
a m-1,1 a m-1,2
... a 0,n-1 ... a1,n-1 ... ... ... a m-1,n-1
行向量
Data Structure
2010-1-2
n阶矩阵; 阶矩阵; 非零元都集中在以主对角线为中心的带状区域中. 所有的非零元都集中在以主对角线为中心的带状区域中 所有的非零元都集中在以主对角线为中心的带状区域中.
Data Structure 2010-1-2 Page 14
压缩存储——对称矩阵 对称矩阵 压缩存储
仅存储下 三角
a11 a12 …. … ….. a1n a21 a22 …….. ……. a2n …………………. an1 an2 ……..
A m×n m×n
a 00 a 10 = ... a m-1,0
a 01 a11 ...
a 02 a12 ...
a m-1,1 a m-1,2
... a 0,n-1 ... a1,n-1 ... ... ... a m-1,n-1
Data Structure
2010-1-2
Page 6
Assign(&A, e, index1, ..., indexn)

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

第5章多维数组和广义表5.1选择题1.数组A中,每个元素的长度为3个字节,行下标I从1到8,列下标J从1到10,从首地址SA开始连续存放在存储器内,该数组占用的字节数为()A)80B)100C)240D)270【答案】C2.数组A中,每个元素的长度为3个字节,行下标I从1到8,列下标J从1到10,从首地址SA开始连续存放在存储器内,该数组按行存放时,元素A[8][5]的起始地址为()A)SA+141 B)SA+144 C)SA+222 D)SA+225【答案】C【解析】数组A有8行10列,按行存放时,LOC(A[8][5])=SA+((8-1)*10+(5-1))*3=SA+222。

3.一个n*n的对称矩阵,如果以行或列为主序放入内存,则其容量为()A)n*n B)n*n/2 C)(n+1)*n/2 D)(n+1)*(n+1)/2【答案】C【解析】对称矩阵可用上(或下)三角矩阵存储,第一行存1个,第二行存2个,…,第n行存n个,共1+2+…+n=(n+1)*n/2。

4.稀疏矩阵一般的压缩存储方法有两种,即()A)二维数组和三维数组B)三元组和散列C)三元组和十字链表 D)散列和十字链表【答案】C5.设有广义表D=(a,b,D),则其长度为(),深度为()A)1 B)3 C)∞D)5【答案】B C6.广义表运算式(Tail((a,B),(c,d)))的操作结果是()A)(c,d) B)c,d C)((c,d)) D)d【答案】C【解析】由于表中共2个元素,分别是两个广义表(a,b),(c,d),(a,B)是表头,因此Tail求得除表头外的元素构成的表即((c,d))。

5.2 填空题1.一维数组的逻辑结构是_____________,存储结构是_____________。

【答案】(1)线性结构(2)顺序结构2.对于二维数组或多维数组,分为按_____________和按_____________两种不同的存储方式存储。

【答案】(1)以行为主序(2)以列为主序3.二维数组A[c1..d1,c2..d2]共含有_____________个元素。

【答案】(d1-c1+1)*(d2-c2+1)4.二维数组A[10][20]采用列序为主方式存储,每个元素占一个存储单元,且A[0][0]的地址是200,则A[6][12]的地址是。

【答案】326【解析】采用列主序时,LOC(A[6][12])=LOC(A[0][0]+(12*10+6)*1=3265.有一个10阶对称矩阵A,采用以行为主序的压缩存储方式,A[0][0]的地址为1,则A[8][5]的地址是。

【答案】42【解析】A[8][5]前有8行,第0行1个元素,第1行2个元素,…,第7行8个元素,共(1+8)*8/2=36个元素,第8行前有5个元素,所以A[8][5]的地址为36+5+1=42。

6.广义表运算式HEAD(TAIL((a,b,c),(x,y,z)))的结果为_____________。

【答案】(x,y,z)5.3 判断题1.数组中存储的数可是任意类型的任何数据()【答案】×【解析】同一数组中数据元素的类型应该相同()2.N*N对称矩阵的经过压缩存储后占用的存储单元是原先的1/2。

【答案】×【解析】应为(N+1)*N/2个存储单元。

3.稀疏矩阵在用三元组表示法时,可节省空间,但对矩阵的操作会增加算法的难度及耗费更多的时间()【答案】√4.广义表不是线性表()【答案】×【解析】广义表是特殊的线性表,其特殊性在于表中的数据元素还可以是广义表。

5.tail(a,b,c,d)得到的是(b,c,d)()【答案】√5.4 应用题1.设有一个二维数组A[m][n],假设A[0][0]存放位置在644,A[2][2]存放位置在676,每个元素占一个空间,问A[3][3]存放在什么位置?【答案】设数组元素A[i][j]存放在起始地址为Loc ( i, j )的存储单元中。

∵ Loc ( 2, 2 ) = Loc ( 0, 0 ) + 2 * n + 2 = 644 + 2 * n + 2 = 676.∴ n = ( 676 - 2 - 644 ) / 2 = 15∴ Loc ( 3, 3 ) = Loc ( 0, 0 ) + 3 * 15 + 3 = 644 + 45 + 3 = 692.2.设有一个n´n的对称矩阵A,为了节约存储,可以只存对角线及对角线以上的元素,或者只存对角线或对角线以下的元素。

前者称为上三角矩阵,后者称为下三角矩阵。

我们把它们按行存放于一个一维数组B中,称之为对称矩阵A的压缩存储方式。

试问:(1)存放对称矩阵A上三角部分或下三角部分的一维数组B有多少元素?(2)若在一维数组B中从0号位置开始存放,则对称矩阵中的任一元素aij在只存下三角部分的情形下应存于一维数组的什么下标位置?给出计算公式。

【答案】(1)数组B共有1+2 + 3 +žžžžžž + n= ( n+1 )*n / 2个元素。

(2)只存下三角部分时,若i ³j,则数组元素A[i][j]前面有i-1行(1~i-1,第0行第0列不算),第1行有1个元素,第2行有2个元素,žžžžžž,第i-1行有i-1个元素。

在第i行中,第j号元素排在第j个元素位置,因此,数组元素A[i][j]在数组B中的存放位置为:1 +2 + žžžžžž + (i-1) + j = ( i-1)*i / 2 + j若i < j,数组元素A[i][j]在数组B中没有存放,可以找它的对称元素A[j][i]。

在数组B的第(j-1)*j / 2 + i位置中找到。

如果第0行第0列也计入,数组B从0号位置开始存放,则数组元素A[i][j]在数组B中的存放位置可以改为:当i ³ j时,= i*(i+1) / 2 + j当i < j时,= j*(j+1) / 2 + i3.利用广义表的head和tail操作写出函数表达式,把以下各题中的单元素banana从广义表中分离出来:(1) L1(apple, pear, banana, orange)(2) L2((apple, pear), (banana, orange))(3) L3(((apple), (pear), (bananA), (orange)))(4) L4((((apple))), ((pear)), (bananA), orange)(5) L5((((apple), pear), bananA), orange)(6) L6(apple, (pear, (bananA), orange))【答案】(1) Head (Tail (Tail (L1)))(2) Head (Head (Tail (L2)))(3) Head (Head (Tail (Tail (Head (L3)))))(4) Head (Head (Tail (Tail (L4))))(5) Head (Tail (Head(L5)))(6) Head (Head (Tail (Head (Tail (L6)))))3.一个稀疏矩阵为,则对应的三元组线性表是什么?其对应的十字链表是什么?【答案】由于线性表中的每个结点对应稀疏矩阵的一个非零元素,其中包括3个字段,分别为该元素的行下标、列下标和值,结点间的次序按矩阵的行优先顺序排列,这个线性表用顺序的方法存储在连续的存储区,则对应的三元组为其十字链表形式为:5.5 算法设计题1.假定数组A[n]的n个元素中有多个零元素,编写算法将A中所有的非零元素依次移到A的前端。

【算法分析】从前向后找零元素A[i],从后向前找非零元素A[j],将A[i]与A[j]交换。

【算法源代码】void move(int A[],int n){int i=0,j=n-1;int temp;while(i<j){while(A[i]!=0) i++;while(A[j]==0) j--;if(i<j){temp=A[i];A[i]=A[j];A[j]=temp;}}}2.给定有m个整数的递增有序数组A[1..m]和有n个整数的递减有序数组B[1..n]。

试写出算法:将数组A和B归并为递增有序数组C[1..m+n]。

(要求:算法的时间复杂度为O(m+n)。

)【算法分析】为保证算法的时间复杂度为O(m+n),即需要对数组A和B的数据元素仅扫描一次就能生成C数组,我们可采用设三个下标指针i,j,k初始时分别指向A数组的最后一个元素(A数组的最大值)、B数组的第一个元素(B数组的最大值)、C数组将存放最大值的位置,然后比较A与B数组的最大值大者放C数组k所指单元;在上述比较中若A数组i所指单元数大,则送完后i前移,否则j 所指单元数送完后j后移,同时k前移,直到把A与B数组的所有元素扫描完。

【算法源代码】#define m 3#define n 4void Merge(int A[],int B[],int C[]){int i,j,k;i=m-1; j=0; k=m+n-1;while((i>=0)&&(j<=n-1)){if(A[i]>B[j]){C[k]=A[i]; i--;}else{C[k]=B[j]; j++; }k--; }while(i>=0) {C[k]=A[i];i--;k--;}while(j<=n-1) {C[k]=B[j];j++;k--; }}3.假设稀疏矩阵A采用三元组表示,编写一个函数计算其转置矩阵B,要求B也用三元组表示。

【算法分析】三元组表示中要求按行的顺序存放,所有转置过程不能直接将行下标和列下标转换,还必须使得列按顺序存放。

因此在A中首先找出第一列中的所有元素,它们是转置矩阵中第一行非0元素,并把它们依次放在转置矩阵三元组数组B中;然后依次找出第二列中的所有元素,把它们依次放在数组B中;按照同样的方法逐列进行,直到找出第n列的所有元素,并把它们依次放在数组B中。

【算法源代码】void transpose(TSMatrix A,TSMatrix *B)/*A是稀疏矩阵的三元组形式,B是存放A的转置矩阵的三元组数组*/{int i,j,k;B->mu=A.nu;B->nu=A.mu;B->tu=A.tu;if(B->tu>0){j=1;for(k=1;k<=A.nu;k++)for(i=1;i<=A.tu;i++)if(A.data[i].col==k){B->data[j].row=A.data[i].col;B->data[j].col=A.data[i].row;B->data[j].e=A.data[i].e;j++;}}}4.求广义表深度的递归算法。

相关文档
最新文档