数据结构与STL_第4章_多维数组与广义表

合集下载

《数据结构》教案 第四章 数组和广义表

《数据结构》教案  第四章 数组和广义表

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

第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码最大的运算是()。

数据结构讲稿课件-第4章串、数组和广义表

数据结构讲稿课件-第4章串、数组和广义表
20XX年复习资料
大学复习资料
专 业: 班 级: 科目老师: 日 期:
• 第2章 线性表
• 第3章 栈和队列
• 第4章 串、数组和广 义表
线性结构
可表示为:(a1 , a2 , ……, an)
2021/3/182021年3月21日
补充:C语言中常用的串运算 调用标准库函数 #include<string.h>
串比较,strcmp(char s1,char s2) 串复制,strcpy(char to,char from) 串连接,strcat(char to,char from) 求串长,strlen(char s)
……
2021/3/182021年3月21日
第4章 串、数组和广义表
教学内容
4.1 串 4.2 数组 4.3 广义表
i
BF算法设计思想
S :ababcabcacbab

T :abc j
i指针回溯
S :ababcabcacbab
T : abc
S :ababcabcacba b
T : abc
BF算法设计思想
Index(S,T,pos)
• 将主串的第pos个字符和模式的第一个字符比较, 若相等,继续逐个比较后续字符; 若不等,从主串的下一字符起,重新与模式的第 一个字符比较。
• 直到主串的一个连续子串字符序列与模式相等 。 返回值为S中与T匹配的子序列第一个字符的序号, 即匹配成功。
• 否则,匹配失败,返回值 0
BF算法描述(算法4.1)
int Index(Sstring S,Sstring T,int pos){ i=pos; j=1; while (i<=S[ 0 ] && j <=T[ 0 ]){ if ( S[ i ]=T[ j ]) {++i; ++j; } else{ i=i-j+2; j=1; } if ( j>T[ 0 ]) return i-T[0]; else return 0;

数据结构与算法分析第4讲 数组和广义表

数据结构与算法分析第4讲 数组和广义表
K=j(j-1)/2+i-1 当i<j
• 矩阵的压缩存储
– 对称矩阵 a11 a12 …. … ….. a1n a21 a22 …….. ……. a2n
…………………. an1 an2 …….. ann
三角矩阵共计元素个 数为:
n(n+1)/2
按行序为主序:
a11 a21 a22 a31 a32 …... an1 …... ann
随机稀疏矩阵的顺序压缩存储
三元组表示法
随机稀疏矩阵的链式压缩存储
十字链表
十字链表
M .chead
^
M .rhead
113
2 2 -1
^^
3 11 2
^1 ^
145
^^
3005 0 -1 0 0 2000
Typedef struct OLNode{
int
i, j;
ElemType
e;
struct OLNode *right, *right;
稀疏矩阵 (Sparse Matrix)
0 0 0 22 0 0 15
0 11 0 0 0 17 0
A67
0 0
0 0
0 0
6 0 0
0
0 0 39 0
901
0 0
0 28
0 0
00 00
0 0
非零元素个数远远少于矩阵元素个数
假设 m 行 n 列的矩阵含 t 个非零元素,
那么称
Chapter 4 Array & General List
Section 1 Array
数组的抽象数据类型定义
ADT Array {
D={ aj1,j2, ...,,ji, jn|ji=0,...,bi-1, i=1,2,..,n } (n称数组的维数,bi是数组第i维的长度,ji是数组元素的第i维

02331数据结构 04数组和广义表

02331数据结构 04数组和广义表

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章

数据结构答案第4章

数据结构答案第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章  多维数组及广义表 答案

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的三元组顺序表和十字链表存储结构图示。

数据结构 多维数组及广义表

数据结构 多维数组及广义表

第1列
Байду номын сангаас
aij的地址为:LOC(aij)= LOC(a00)+(j×m+i)× d
二维数组的逻辑特征和存储方法可以很容易地推广到多维数 组。 例如三维数组可以看成是由二维数组组成的线性表,三维数 组中的每个元素最多有三个直接前趋和三个直接后继。 同样,行优先原则和列优先原则也可以推广到多维数组,按 行优先原则时先排最右的下标,按列优先原则时先排最左的下 标。 得到行优先或列优先序列后,可以把它们依次存放在连续的 存储空间中,这就是多维数组的顺序存储,同样可实现随机存 取。
a00 C C a01 a11 C a12 a22 a0,n-1 a1,n-1
……
C
……
C
an-1,n-1
若上三角阵以行优先顺序存储,则地址公式与对称矩阵的行 优先顺序存储上三角的地址公式相似,元素的下标k为:
k= i(2n-i+1)/2+j-i i≤j (上三角) n(n+1)/2 i>j (下三角)
(1)行优先顺序存储下三角 以图(a)所示的n阶方阵为例,行优先顺序存储下三角时 元素的排列顺序如图(b)所示,存储在一维数组中如图(c )所示。
a00 a10 a20 a01 a11 a21 a22 a0,n-1 a1,n-1 a00 a01 a10 a11 a20 a21 a22 a0,n-1 a1,n-1
1.三元组顺序表
将三元组表中的三元组按照行优先的顺序排列成一个序列, 然后采用顺序存储方法存储该线性表,称为三元组顺序表。矩 阵A的三元组顺序表为:
0 11 0 -3 A6×7= 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 6 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 B6×7= 4 0
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

转置
data[0] data[1] data[2] data[3] data[4] data[5] … row col value 0 1 2 1 3 9 m=5 2 0 3 n=4 3 2 6 t=6 4 0 1 4 3 4 … … …
0 0 3 0 1
2 0 0 0 0
0 0 0 6 0
0 9 0 0 4
17
#define MAX_ELEMENT_NUMBER 1000 template <class T> struct MatrixNode //定义三元组结构 { int row; //非零元素的行号 int col; //非零元素的列号 T value; //非零元素的值 }; template <class T> struct SpareMatrix //定义三元组表结构 { int m; //稀疏矩阵的行数 int n; //稀疏矩阵的列数 int t; //稀疏矩阵非零元素的个数 MatrixNode <T> data[MAX_ELEMENT_NUMBER]; //存储非零元素对应的三元组 };
0 2 0 0 0 0 0 9 3 0 0 0 0 0 6 0 1 0 0 4 data[0] 0 2 3 data[1] 0 4 1 data[2] 1 0 2 data[3] 2 3 6 data[4] 3 1 9 data[5] 3 4 4 … … … … m=4 n=5 t=6
《数据结构与STL》
假设 m 行 n 列的矩阵含 t 个非零元素, 则称
t m n
为稀疏因子。
通常认为 0.05 的矩阵为稀疏矩阵。
《数据结构与STL》 16
4.2.2 稀疏矩阵压缩存储
存储稀疏矩阵时,只需要存储非零元素。常见的 稀疏矩阵压缩方法:三元组表和十字链表
稀疏矩阵中每个非零元素的行号、列号及值构成 row col value 一个三元组(3-tuples)
三对角矩阵
在存储对角矩阵时,可将对角线附近的带状区域元素 立起来,形成一个列数较少的新矩阵,然后可按行优 先方式存储这个新矩阵。
x 3 8 4 1 1 4 6 2 3 2 7 5 9 x x 1
第1行
2
3
4
第2 行
7
8
6
第3 行
5
4
2
第4 行
9
1
3
第5 行
14
《数据结构与STL》
n维m对角矩阵A(m为奇数),设其对角线附近的元素aij存储到 一维数组元素sa[k]中。由于aij在对角线附近,因此
对于n阶三角矩阵,需要存储n(n+1)/2+1个元素
《数据结构与STL》 11
上三角矩阵存储
按行优先存储n阶上三角矩阵,设aij存储到sa[k]中, 若aij位于矩阵上三角,有0≤i≤j<n,则在存储aij之前, sa数组中首先要存储前i行上三角的元素,然后再存储aij 所在行从aii到ai,j-1的元素
12
《数据结构与STL》
作业
按行优先存储n阶下三角矩阵时,首先存储下三 角的元素,最后存储上三角的常数项c。给出 aij与sa[k]的对应关系。
对于按列优先方式存储的n阶三角矩阵,请推导 元素存储位置k与下标i、j的对应关系
《数据结构与STL》
13
对角矩阵
所有非零元素都集中在对角线附近的方阵
1 3 0 0 0 2 4 8 0 0 0 7 6 4 0 0 0 5 2 1 0 0 0 9 3
《数据结构与STL》 3
行优先存储——基本思想是按行存储,即存完 第i行再接着存储第i+1行。按行优先顺序存储 二维数组Amn,线性序列为: a11,a12,…,a1n,a21,a22,…,a2n,…,am1,am2,…,amn
1 1 a11 j n
Loc(aij) =Loc(a11)+((i-1)×n+j-1)×c
max(i-(m-1)/2,0)≤j≤min(i+(m-1)/2,n-1)
aij之前共有i行,每行m个元素,首先要存储这mi个元素。 在aij所在行上,aij之前共有j-i+(m-1)/2个元素。 因此在存储aij之前,总共要存储mi+j-i+(m-1)/2个元素,即有: k=mi+j-i+(m-1)/2=(m-1)i+j+(m-1)/2
k ( (n l )) j i ni (i i ) / 2 j
2 l 0
i 1
若aij位于矩阵下三角,有0≤j<i<n,此时所有的aij具 有相同的值,只需保存1个值
k = n(n+1)/2 (0≤j<i<n)
a00 a01 a0n c a11 a 1n A c c ann
data[0] data[1] data[2] data[3] data[4] data[5] …
row col value 0 1 2 1 3 9 m=5 2 0 3 n=4 3 2 6 t=6 4 0 1 4 3 4 … … …
由于每趟遍历都需要比较所有的t个三元组的列号,因 此算法的时间复杂度为O(nt)。
x 3 8 4 1 1 4 6 2 3 2 7 5 9 x x 1
第1 行
1 3 0 0 0
2 4 8 0 0
0 7 6 4 0
0 0 5 2 1
0 0 0 9 3
2
3
4
第2 行
7
8
6
第3 行
5
4
2
第4 行
9
1
3
第5 行
15
《数据结构与STL》
4.2.2 稀疏矩阵压缩存储
矩阵Amn中的非零元素个数s远远小于矩阵元素 的总数m×n
《数据结构与STL》 18
稀疏矩阵的转置操作
0 2 0 0 0 0 0 9 3 0 0 0 0 0 6 0 1 0 0 4 data[0] data[1] data[2] data[3] data[4] data[5] … row col value 0 2 3 0 4 1 1 0 2 m=4 n=5 2 3 6 t=6 3 1 9 3 4 4 … … …
《数据结构与STL》
第四章 多维数组与广义表
北京邮电大学 信息与通信工程学院
第四章 多维数组和广义表
学习内容: 4.1 多维数组 4.2 矩阵的压缩存储 4.3 广义表 4.4 实例分析 4.5 使用STL操作多维数组 (计划学时2h)
《数据结构与STL》
2
4.1 多维数组
由类型相同的数据元素构成的有序集合。对于k 维数组,每个元素都要受k个线性关系的约束。
《数据结构与STL》 20
简单转置算法
//将稀疏矩阵OrigMat转置为TransMat template <class T> void TransMat(SpareMatrix <T> * OrigMat, SpareMatrix <T> * TransMat) { TransMat->m = OrigMat->n;//设置转置矩阵的行数 TransMat->n = OrigMat->m;//设置转置矩阵的列数 TransMat->t = 0;//初始时转置矩阵的非零元素个数为 for (int col=0;col<OrigMat->n;col++) for (int j=0;j<OrigMat->t;j++) if (OrigMat->data[j].col == col)//找出列号为col的三元组 { TransMat->data[TransMat->t].col = OrigMat->data[j].row ; TransMat->data[TransMat->t].row = OrigMat->data[j].col ; TransMat->data[TransMat->t].value = OrigMat->data[j].value ; TransMat->t++;//非零元素个数增 } }
特殊矩阵压缩存储 对称矩阵 三角矩阵 对角矩阵
稀疏矩阵压缩存储
《数据结构与STL》 8
对称矩阵
1 2 0 4 3
0 0 a00 a10 a11
共i行
2 0 7 8 1
0 7 6 5 4
j-1
4 8 5 2 9
j
3 1 4 9 3
n(n 1) 共需要存储的元素数目 k 2 k 1
n
设所有元素存储到一维数组sa中,aij 存储在sa[k]元素中,k与ij的关系?
共i-1行
a1 n
i
共j-1列
aij a11
aij之前共有(i-1)n+j-1个元素
… a1n a21 … a2n …
第1行 第2 行
ai1
… aij-1 aij
第i 行

ain
… amn
m
am 1
如果从a0开始: Loc( ) =Loc( a00)+(i×n+j)×c 在 C++a 、 等语言中,数组都是按行优先存储的 ijPASCAL
《数据结构与STL》
19
稀疏矩阵简单转置算法
遍历n趟三元组表:

• •
第一趟遍历找出列号为0的三元组,并将其行号和列号对调, 添加到转置矩阵对应的三元组表中。 第二趟遍历找出列号为1的三元组并进行相同的操作, 依次类推,最后一趟遍历找出列号为n-1的三元组。
data[0] data[1] data[2] data[3] data[4] data[5] … row col value 0 2 3 0 4 1 1 0 2 m=4 n=5 2 3 6 t=6 3 1 9 3 4 4 … … …
相关文档
最新文档