数据结构与STL_第4章_多维数组与广义表
- 格式:ppt
- 大小:2.56 MB
- 文档页数:55
ch4 数组和广义表本实习单元是作为从线性结构到非线性结构的过渡来安排的。
数组和广义表可以看成其元素本身也是自身结构( 递归结构 ) 的线性表。
广义表本质上是一种层次结构 , 自顶向下识别并建立一个广义表的操作,可视为某种树的遍历操作:遍历逻辑的〈或符号形式的)结构,访问动作是建立一个结点。
稀疏矩阵的十字链表存储结构也是图的一种存储结构。
由此可见,这个实习单元的训练具有承上启下的作用。
希望读者能深入研究数组的存储表示和实现技术,熟悉广义表的存储结构的特性。
编程技术训练要点:稀疏矩阵的表示方法及其运算的实现(4.1〉;共享数据的存储表示方法(4.2);形式系统的自底向上和自顶向下识别技术(4.3 〉; 递归算法的设计方法(4.3);表达式求值技术 (4.4) 。
1. 稀疏矩阵运算器【问题描述】稀疏矩阵是指那些多数元素为零的矩阵。
利用 " 稀疏 " 特点进行存储和计算可以大大节省存储空间 , 提高计算效率。
实现一个能进行稀疏矩阵基本运算的运算器。
【基本要求】以"带行逻辑链接信息"的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。
稀疏矩阵的输入形式采用三元组表示 , 而运算结果的矩阵则以通常的阵列形式列出。
【测试数据】【实现提示】1. 首先应输入矩阵的行数和列数 , 并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。
可设矩阵的行数和列数均不超过 20 。
2. 程序可以对三元组的输入顺序加以限制 , 例如 , 按行优先。
注意研究教科书 5.3.2节中的算法 , 以便提高计算效率。
3. 在用三元组表示稀疏矩阵时 , 相加或相减所得结果矩阵应该另生成 , 乘积矩阵也可用二维数组存放。
【选作内容】1. 按教科书 5.3.2 节中的描述方法 , 以十字链表表示稀疏矩阵。
2. 增添矩阵求逆的运算 , 包括不可求逆的情况。
在求逆之前 , 先将稀疏矩阵的内部表示改为十字链表。
第4章数组和广义表【例4-1】二维数组A的每一个元素是由6个字符组成的串,其行下标i=0,1,…,8,列下标j=1,2,…,10。
若A以行为主序存储元素,A[8][5]的物理地址与当A按列为主序存储时的元素()的物理地址相同。
设每个字符占一个字节。
A.A[8][5] B.A[3][10] C.A[5][8] D.A[0][9]解:二维数A是一个9行10列的矩阵,即A[9][10]。
按行存储时,A[8][5]是第85个元素存储的元素。
而按列存储时,第85个存储的元素是A[3][10]。
即正确答案为B。
【例4-2】若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[n(n+1)/2]中,则在B中确定的位置k的关系为()。
A.jii+-2)1(*B.ijj+-2)1(*C.jii++2)1(*D.ijj++2)1(*解:如果a ij按行存储,那么它的前面有i-1行,其有元素个数为:1+2+3+…+(i-1)=i(i-1)/2。
同时它又是所在行的第j列,因此它排列的顺序还得加上j,一维数组B[n(n+1)/2]中的位置k与其下标的关系是:jii+-2)1(*。
因此答案为A。
【例4-3】已知n阶下三角矩阵A,按照压缩存储的思想,可以将其主对角线以下所有元素(包括主对角线上元素)依次存放于一维数组B中。
请写出从第一列开始以列序为主序分配方式时在B中确定元素a ij的存放位置的公式。
解:如果a ij按列存储,那么它的前面有j-1列,共有元素:n+(n-1)+(n-2)+ …+[n-(j-2)]=(j-1)*n-2)1)(2(--jj而它又是所在列的第i行,因此在它前的元素个数还得加上i。
因此它在一维数组B中的存储顺序为:(j-1)*n-2)1)(2(--jj+i【例4-4】已知广义表L=((x,y,z),a,(u,t,w)),从L表中取出的原子项ASCII码最大的运算是()。
02331数据结构 04数组和广义表02331数据结构-04数组和广义表第四章多维数组和广义表1.多维数组和广义表是一种复杂的非线性结构,它们的逻辑特征是:一个数据元素可能有多个直接前驱和多个直接后继。
2.一维数组(矢量)是存储在计算机连续存储空间中的若干具有统一类型的数据元素。
同一数组的不同元素通过不同的下标标识。
(a1,a2,…,an)3.二维数组amn可视为由m个行向量组成的向量,或由n个列向量组成的向量。
二维数组中的每个元素aij既属于第i行的行向量,又属于第j列的列向量。
4.多维数组:3D数组AMNP可以看作是一个以2D数组为数据元素的向量。
将三维阵列的四维向量作为视觉数据三维数组中的每个元素aijk都属于三个向量。
四维数组中的每个元素都属于四个向量……5.数组的顺序存储:由于计算机内存是一维的,因此多维数组的元素应按线性顺序排列并存储在内存中。
数组通常不执行插入和删除操作,也就是说,结构中的元素数量和元素之间的关系不会改变。
通常,顺序存储方法用于表示阵列。
(1)行优先级:按行向量排列数组元素,I+1行向量紧跟在第I行向量之后。
【示例】二维数组amn的行首存储的线性序列为:a11,A12,。
,A1N,A21,A22,。
,A2N,。
,AM1,AM2,。
,amn(2)列优先级将数组元素按列向量排列,第i+1个列向量紧接在第i个列向量后面。
【例】二维数组amn的按列优先存储的线性序列为:a11,a21,…,am1,a12,a22,…,am2,……,a1n,a2n,…,amn6.数组元素的地址计算公式:(1)按行优先级顺序存储的二维数组amn地址计算公式loc(aij)=loc(a11)+[(i-1)×n+j-1]×d(注:此公式下界为1,如下界为0,则公式变为[i×n+j])①loc(a11)是开始结点的存放地址(即基地址)②d为每个元素所占的存储单元数③ 根据地址计算公式,可以通过地址公式同时在内存中访问数组中的任何元素。
数据结构答案第4章本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.March第 4 章广义线性表——多维数组和广义表2005-07-14第 4 章广义线性表——多维数组和广义表课后习题讲解1. 填空⑴数组通常只有两种运算:()和(),这决定了数组通常采用()结构来实现存储。
【解答】存取,修改,顺序存储【分析】数组是一个具有固定格式和数量的数据集合,在数组上一般不能做插入、删除元素的操作。
除了初始化和销毁之外,在数组中通常只有存取和修改两种操作。
⑵二维数组A中行下标从10到20,列下标从5到10,按行优先存储,每个元素占4个存储单元,A[10][5]的存储地址是1000,则元素A[15][10]的存储地址是()。
【解答】1140【分析】数组A中每行共有6个元素,元素A[15][10]的前面共存储了(15-10)×6+5个元素,每个元素占4个存储单元,所以,其存储地址是1000+140=1140。
⑶设有一个10阶的对称矩阵A采用压缩存储,A[0][0]为第一个元素,其存储地址为d,每个元素占1个存储单元,则元素A[8][5]的存储地址为()。
【解答】d+41【分析】元素A[8][5]的前面共存储了(1+2+…+8)+5=41个元素。
⑷稀疏矩阵一般压缩存储方法有两种,分别是()和()。
【解答】三元组顺序表,十字链表⑸广义表((a), (((b),c)),(d))的长度是(),深度是(),表头是(),表尾是()。
【解答】3,4,(a),((((b),c)),(d))⑹已知广义表LS=(a,(b,c,d),e),用Head和Tail函数取出LS中原子b的运算是()。
【解答】Head(Head(Tail(LS)))2. 选择题⑴二维数组A的每个元素是由6个字符组成的串,行下标的范围从0~8,列下标的范围是从0~9,则存放A至少需要()个字节,A的第8列和第5行共占()个字节,若A按行优先方式存储,元素A[8][5]的起始地址与当A按列优先方式存储时的()元素的起始地址一致。
4 多维数组及广义表4.1回答下列概念:三元组表、广义表、十字链表三元组表:稀疏矩阵中的非零元素三元组组成的线性表。
广义表:也称为列表(Lists)是n(n≥0)个元素a1,a2,…,a i,…,a n的有限序列,元素a i可以是原子或者是子表(子表亦是广义表)。
十字链表:稀疏矩阵(即三元组表)的一种链接存储结构。
稀疏矩阵中每个非零元素都用一个包含五个域的结点来表示,存储非零元素所在行的行号域i,存储非零元素所在列的列号域j,存储非零元素值的值域v,以及行指针域right和列指针域down,分别指向同一行中的下一个非零元素结点和同一列中的下一个非零元素结点。
4.2二维数组在采用顺序存储时,元素的排列方式有哪两种?行优先和列优先。
4.3 矩阵压缩存储的目的是什么?请写出对称阵压缩存储四种方式的地址公式。
压缩存储的目的:节省矩阵的存储空间。
将对称矩阵的下(上)三角存储在数组长度为n(n+1)/2的数组sa中,设矩阵中的某一个元素a ij在数组中的下标为k,则对称阵压缩存储四种方式下k的计算公式如下:(1)行优先顺序存储下三角i(i+1)/2+j i≥j (下三角)k=j(j+1)/2+i i<j(上三角)(2)列优先顺序存储下三角j(2n-j+1)/2+i-j i≥j (下三角)k=i(2n-i+1)/2+j-i i<j (上三角)(3)行优先顺序存储上三角i(2n-i+1)/2+j-i i≤j (上三角)k=j(2n-j+1)/2+i-j i>j (下三角)(4)列优先顺序存储上三角j(j+1)/2+i i≤j (上三角)k=i(i+1)/2+j i>j (下三角)4.4 在特殊矩阵和稀疏矩阵中,哪一种经过压缩存储后会失去随机存取的特性?稀疏矩阵。
4.5 设有一个10阶的对称矩阵A,以行优先顺序存储下三角元素,其中a00为第一元素,其存储地址为1,每个元素占一个字节,则a 85的地址为多少?若a 11为第一元素,那么a 85的地址又会是多少?若a 00为第一元素,则a 85的地址为:41 若a 11为第一元素,则a 85的地址为:324.6 请给出图4.10中稀疏矩阵A 6×7的三元组顺序表和十字链表存储结构图示。
第4章数组和广义表第4章数组和广义表本章主要介绍下列内容:1.数组的定义、基本运算和存储结构2.特殊矩阵的压缩存储3.广义表的定义、术语、存储结构、运算4.递归算法设计课时分配:1两个学时,2两个学时,3两个学时, 4两个学时重点、难点:特殊矩阵的压缩存储、广义表的存储结构、递归算法设计第一节数组1.数组的定义和基本运算数组的特点是每个数据元素可以又是一个线性表结构。
因此,数组结构可以简单地定义为:若线性表中的数据元素为非结构的简单元素,则称为一维数组,即为向量;若一维数组中的数据元素又是一维数组结构,则称为二维数组;依次类推,若二维数组中的元素又是一个一维数组结构,则称作三维数组。
结论:线性表结构是数组结构的一个特例,而数组结构又是线性表结构的扩展。
举例:其中,A是数组结构的名称,整个数组元素可以看成是由m个行向量和n个列向量组成,其元素总数为m×n。
在C语言中,二维数组中的数据元素可以表示成a[表达式1][表达式2],表达式1和表达式2被称为下标表达式,比如,a[i][j]。
数组结构在创建时就确定了组成该结构的行向量数目和列向量数目,因此,在数组结构中不存在插入、删除元素的操作。
二维数组结构的基本操作:(1)给定一组下标,修改该位置元素的内容Assign(A,elem,index1,index2)(2)给定一组下标,返回该位置的元素内容Value(A,elem,index1,index2)2.数组的存储结构从理论上讲,数组结构也可以使用两种存储结构,即顺序存储结构和链式存储结构。
然而,由于数组结构没有插入、删除元素的操作,所以使用顺序存储结构更为适宜。
换句话说,一般的数组结构不使用链式存储结构。
组成数组结构的元素可以是多维的,但存储数据元素的内存单元地址是一维的,因此,在存储数组结构之前,需要解决将多维关系映射到一维关系的问题。
举例:LOC(i,j)=LOC(0,0)+(n*i+j)*L数组结构的定义:#define MAX_ROW_INDEX 10#define MAX_COL_INDEX 10typedef struct{Elemtype elem[MAX_ROW_INDEX][MAX_COL_INDEX] } ARRAY;基本操作算法举例:(1)给数组元素赋值void Assign(ARRAY *A,Elemtype elem,int index1,int index2) { if (index1<0||index1>=MAX_ROW_INDEX||index2<0||index2>=MA X_COL_INDEX) exit(ERROR);else A->elem[index1][index2]=elem; }(2)返回给定位置的元素内容int Value(ARRAY A,Elemtype *elem,int index1,int index2){ if (index1<0||index1>=MAX_ROW_INDEX|| index2<0||index2>=MAX_COL_INDEX) return FALSE;else { *elem= A.elem[index1][index2]; return OK;3.矩阵的压缩存储矩阵是在很多科学与工程计算中遇到的数学模型。