第5章多维数组与广义表
合集下载
《数据结构与算法(C++语言版)》第5章 多维数组与广义表

数 组
• 4.寻址公式的计算 • 下面考虑如何根据一组给定下标求出对应数组元素地址的 问题,这是数组最重要的基本操作,一般用在高级语言的 实现当中。这里只考虑n维数组按行存储的寻址公式的计算。 用秦九韶法变换按行存储公式中的主要部分: • j1d2d3…dn + j2d3…dn +…+jn–1dn + jn • =(j1d2+ j2)d3…dn + j3d4…dn +…+jn–1dn + jn • =((j1d2+ j2)d3+ j3)d4…dn + j4d5…dn +…+jn–1dn + jn • =… • =(…(j1d2+ j2)d3+ j3)d4+j4)d5+…+jn–1)dn+ jn • =(…((0×d1+j1)d2+ j2)d3+ j3) d4+j4)d5+…+jn–1)dn+ jn
数 组
• 1. 一维数组 • 一维数组的每个元素只含一个下标,其实质上是一个线性 表,存储方法与普通线性表的顺序存储方法完全相同,即 将数组元素按它们的逻辑次序存储在一片连续区域内。设 一维数组为A =(a0, a1,…, an–1),则它的元素ai的相对地址为 Loc(ai) = i×c。这里,c表示每个元素占用的存储单元数目。
矩阵的压缩存储
• 矩阵是很多科学与工程计算问题研究的数学对象。在高级 语言程序设计中,常用二维数组来存储矩阵元素,有些程 序语言还提供了各种方便用户使用的矩阵运算。然而,对 于在数值分析中经常出现的一些阶数很高,且矩阵中有许 多值相同的元素或者是零元素的特殊矩阵,不适合用二维 数组来存放,因为这将造成大量存储空间的浪费。为了节 省存储空间,可对这类矩阵进行压缩存储,即为多个值相 同的元素只分配一个存储空间,对零元素不分配空间。
数组和广义表

2.三维及多维数组
三维数组Amnp: 可看成有p个二维数组(m*n)所组成的向量,
每个元素aijk同属于三个向量,每个元素最多有3个直接前趋
和3个直接后继。
推广:多维数组An1n2…nm可看成nm个(m-1)维数组所 构成的向量, 任一元素ai1i2…im都属于m个向量,最多有
பைடு நூலகம்
m个直接前趋和m个直接后继。
a11 a21 …... am1a12 a22 …… am2 … … a1n a2n … amn
第 1列
第 2列
第 n列
(以二维数组Amn为例,且数组采用行优先顺序) LOC(aij)=LOC(a11)+[(i-1)*n+j-1]*d
开始元素的 存储起址
n为列数 d为单个元素 所占单元数
c语言中因数组下标从0开始,因此上面的式子应改为: LOC(aij)=LOC(a00)+(i*n+j)*d 随机存取结构 顺序存储的数组是一个随机存取结构,即只要知道开始元
-3 0 0 2 0
转置
B=
0 0 0 0 1 2
0 0 0
0 0 -3 0 2 0 0 0
A= 0 0 0 1 0
-3 0 0 2 0
转置
2 0 0
B=
0 0 0 0 1 2 0 0 0
i 0 1 2
j 1 3 0
v 2 1 -3
i 0
j 2 0 1 2
v -3 2 1 2
转置后
1 3 3
2
3
2
二、多维数组的运算
对于多维数组,通常只有两种操作: 1. 取值:给定一组下标,存取相应的数据元素; 2. 修改:给定一组下标,修改相应数据元素中的某一个
数据结构:第五章:多维数组、稀疏矩阵和广义表

浙江大学计算机学院 杨枨
数据结构
第五章
A的深度为1 B的深度为1 C的深度为2 D的深度为∞
第 21 页 2020年7月5日
5.3.2 存储结构
通常采用链式结构来进行存储
tag
data/link
next
图 5-8 广义表链式存储结构中的结点结构
➢ tag为标志域 ✓ tag=0,则表示该结点为原子结点 ✓ tag=1,则表示该结点为子表
➢ 反之,我们如果按非零元素在A中的列主序进行转置,得到的就是必是按行主序排列的 转置矩阵。
➢ 转置算法的基本思想是:
✓ 对A的三元组表进行c次扫描(c是A的列数),每次扫描都把A的某一列中的非零元 素按序排好,放入B的三元组表中,就得到了B的一行。
✓ 在每次扫描中,为了找到A的每一列中的每一个非零元素,都必须从头到尾扫描A 的三元组表。
➢ 求广义表的深度 ➢ 求广义表的长度、插入、删除、查找等
浙江大学计算机学院 杨枨
数据结构
第 23 页 2020年7月5日
5.3 小结
介绍:
➢ 多维数组 ➢ 稀疏矩阵
✓ 稀疏矩阵可看作是一种特殊的二维数组, ✓ 稀疏矩阵进行压缩存储,可以有效地节省存储空间 ➢ 广义表 ✓ 广义表是一种复杂的数据结构 ✓ 存储表示方法。
浙江大学计算机学院 杨枨
数据结构
第 17 页 2020年7月5日
5.2.2 稀疏矩阵的转置运算
第五章
用三元组顺序表表示的稀疏矩阵的转置运算
➢ 在这个算法中,外层循环用于控制扫描次数,共扫描c次(c是A的列数),每 次扫描都排好B的一行;
➢ 内层循环从头到尾扫描A的三元组表以判断三元组表中的每一个元素是否需要 转置。
数据结构(Java版)-电子教案 第五章 维数组和广义表

例如,二维数组:
A1=( a11 a12 … a1n) A=(A1,A2,…Am)
A2=(a21 a22 … a2n)
… … ……
Amn
Am=(am1 am2 … amn )
a11 a12 .....a 1n a 21 a 22 .....a 2n .......... .......... a m1 a m2 .....a mn
3 4
Ai2 x+10*m x+11*m x+12*m x+13*m x+14*m
Ai3 x+15*m x+16*m x+17*m x+18*m x+19*m
x x+m x+2*m x+3*m x+4*m
址为x
5 6 假设每一个元素占用的存储空间大小为 m,A00的内存地 第二排
5.2 多维数j A1j A2j A3j A4j
1
Ai1 x+m x+5*m x+9*m x+13*m x+17*m
3 4
Ai2 x+2*m x+6*m x+10*m x+14*m x+18*m
Ai3 x+3*m x+7*m x+11*m x+15*m x+19*m
5.1 多维数组
5.1.2 多维数组在计算机内的存放 由于计算机的内存结构是一维的,因此用一维内存来表示 多维数组,就必须按某种次序将数组元素排成一序列,然后 将这个线性序列存放在存储器中。又由于对数组一般不做插 入和删除操作,也就是说,数组一旦建立,结构中的元素个 数和元素间的关系就不再发生变化。因此,一般都是采用顺 序存储的方法来表示数组。
《数据结构——用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
第五章 数组和广义表
在压缩存储时,矩阵中值相同的元素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
05 第5章 数组和广义表

例如,图5-1是一个3*3的对称矩阵。
1
A= 2
2 5 4
3 4 6
3
图 5-1 一个对称矩阵
******上课时请保持课堂的安静,谢谢大家!!!
2014年3月20日星期四
第12页
数据结构 电子教案 — [ 湖北汽车工业学院 软件教研室 马春江 特别制作 ] 首页 尾页 上页 下页 范例 讨论 考题 帮助 关于 结束
2014年3月20日星期四
数据结构 电子教案 — [ 湖北汽车工业学院 软件教研室 马春江 特别制作 ] 首页 尾页 上页 下页 范例 讨论 考题 帮助 关于 结束
×
5.3 特殊矩阵及其压缩存储
5.3.1
特殊矩阵
1、对称矩阵 若一个n阶方阵A中元素满足下列条件:
aij=aji 其中 0 ≤i, j≤n-1,则称A为对称矩阵。
图 5-3
一个 77 的三对角矩阵
2014年3月20日星期四
******上课时请保持课堂的安静,谢谢大家!!!
第14页
数据结构 电子教案 — [ 湖北汽车工业学院 软件教研室 马春江 特别制作 ] 首页 尾页 上页 下页 范例 讨论 考题 帮助 关于 结束
×
5.3.2
压缩存储
1、对称矩阵 若矩阵 Ann 是对称的,对称的两个元素 可以共用一个存储单元,这样,原来 n 阶方 阵需 n2个存储单元,若采用压缩存储,仅需 n(n+1)/2个存贮单元,将近节约一半存贮单元, 这就是实现压缩的好处。但是,将n阶对称方 n ( n 1) 阵 存 放 到 一 个 向 量 空 间 s[0] 到 s[ 2 -1] 中,我们怎样找到 s[k] 与 a[i][j] 的一一对称应 关系呢?使我们在s[k]中直接找到a[i][j]。
多维数组和广义表

an-10, an-11,…,an-1n-1的次序存放在一个含有n(n+1)/2个
元素的向量sa[]中(因下三角元素总数为n(n+1)/2)。即
将aij存放在sa[i(i+1)/2+j]中(0≤i≤n-1,0 ≤j≤i)。
VC++
7
表第 五 章
多 维 数 组 和 广 义
算 法 演
②对称矩阵中的元素aij和sa[k]之间的对应关系: 若i≥j,k=i×(i+1)/2+j 0≤k<n(n+1)/2
页
对于三元组表,除了描述稀疏矩阵的非零元素
外,为了运算方便,还应将矩阵的总行数、总列数
下 一
和非零元素的总数也作为三元组表的属性进行描述。
页 4、三元组表的描述
#define MaxSize 100 //三元组表空间的最大容量
返 typedef int DataType //结点类型
回 typedef struct { //三元组结点定义
和n个直接后继。
下 一
因此,多维数组的逻辑特征是:一个数据元素可能
页 有多个直接前驱和多个直接后继。
三、数组的顺序存储表示
返
由于计算机内存的结构是一维的,因此用内存来
回 表示多维数组,必须将数组元素按某种次序排成线
性序列后存人存储器。又由于数组一般不做插入和
VC++
删除操作,即数组一旦建立,结构中元素个数和元
按行优先顺序元素aij存放在sa[2i+j]中。
10
表第 五 章
多 维 数 组 和 广 义
算 二、稀疏矩阵的压缩存储
法 演
1、稀疏矩阵的定义:设矩阵Amn中有s个非零元素,
第五章 多维数组和广义表

通常把与树对应的广义表称为纯表,它限制了表中成 分的共享和递归;把允许结点共享的表称为再入表;而把 允许递归的表称为递归表。它们之间的关系满足:递归表 再入表 纯表 线性表。 广义表三个特殊的基本运算:取表头GetHead(LS)、 取表尾GetTail(LS)和表长Length(LS)。 根据表头、表尾的定义可知:任何一个非空广义表的 表头是表中第一个元素,它可以是原子,也可以是子表, 而其表尾必定是子表。 2. 广义表的举例 (1)E=( ) GetHead(E)=空 GetTail(E)=( ) Length(E)=0
5.1
多维数组
1. 数组的定义 数组是由一组类型相同的数据元素构造而成的。数组元 素在数组中的相对位置是由下标确定的。 一维数组、二维数组。 二维数组可称为矩阵。 a11 Amn= a21 … am1 图5-1 a12 … a1n a22 … a2n … … … am2 … amn 二维数组结构
m维数组An1n2…nm的每个元素ai1i2…im都属于m个向量, 最多可以有m个直接前趋和m个直接后继。 如把数据元素的下标顺序变成线性表的序号,则一 维数组就是一个线性表。
3. 对角矩阵 对角矩阵中,所有的非零元素集中在以主对角 线为中心的带状区域中,即除了主对角线和主对角线 相邻两侧的若干条对角线上的元素之外,其余元素皆 为零。如图所示:
对角矩阵可按行优先顺序或对角线的顺序,将 其压缩存储到一个向量中,并且也能找到每个非零元 素和向量下标的对应关系。
5.2.2
稀疏矩阵Biblioteka 令I=max(i,j),J=min(i,j),则k和i,j的对应关系为: k=I×(I+1)/2+J 0≤k<n(n+1)/2 aij的地址计算公式: LOC(aij)=LOC(sa[0])+[I×(I+1)/2+J]×d 举例: A是4*4的对称阵,采用压缩存储方式存储,已知A00 的存储地址为1,求A32的存储地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个m×n的二维数组可以看成是m行的一维数 组,或者n列的一维数组。
• 一个m行n列的二维数组的顺序存储结构
– 次序约定
a00 a 00 按列序为主序存放 a10 • 以行序为主序 a 按行序为主序存放 01 ……. • 以列序为主序 ……. am-10 a n-1 0n-1 m-1 m a01 a n 10 a01 …….. a0n-1 00 a11 aa a …….. a a 11 00 01 0n-1 a a11…….. ……..a a1n-1 …….. …….. 10 a a10 11 1n-1 am-11 a 1n-1 …………………. …………………. ………. ………. am-10 am-11 …….. am-1n-1 a0n-1 a am-10 am-11 …….. am-1n-1 m-10 a1n-1 a m-11 Loc(aij)=Loc( aa )+[j*m+i]*L 00 Loc( aij)=Loc( …….. …….. 00)+[i*n+j]*L m*n-1 m*n-1 a am-1n-1 m-1n-1
稀疏矩阵和对应的三元组线性表
列号 1 行号 1 2 3 4 5 6 2 3 4 5 6 7
0 0 0 19 0 0
0 11 0 17 0 0 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 37 0 0 0 0 0 0 0 0 50
数组符合线性结构的定义。数组和线性表相比, 相同之处是它们都是若干个相同数据类型的数据元素 a0,a1,a2,...,a0-1构成的有限序列。 不同之处是: (1)数组要求其元素占用一块地址连续的内存单元空间,而 线性表无此要求; (2)线性表的元素是逻辑意义上不可再分的元素,而数组中 的每个元素还可以是一个数组; (3)数组的操作主要是向某个下标的数组元素中存数据和取 某个下标的数组元素,这和线性表的插入、删除操作不同。 线性结构(包括线性表、堆栈、队列、串)的顺序存储结 构实际就是使用数组来存储。可见,数组是其他数据结构实现 顺序存储结构的基础,是软件设计中最基础的数据结构。
0 1 1
5.2 特殊矩阵 特殊矩阵:指有许多值相同的元素或有许多零元素、且值 相同的元素或零元素的分布有一定规律的矩阵。
1.几种特殊矩阵的压缩存储:
(1)n阶对称矩阵 在一个n阶方阵A中,若元素满足下述性质: aij=aji (1≤i,j≤n)
a11 a12 …. … ….. a1n
a21 a22 …….. ……. a2n
va
按行序为主序:
a11 a21 a22 a31 a32 …... k=0 1 2 3 4
an1 …... ann n(n-1)/2 n(n+1)/2-1
(2)n阶三角矩阵 以主对角线划分, n阶三角矩阵有n阶上三角矩阵和n 阶下三角矩阵两种。
n阶上三角矩阵如下图 (a)所示,它的下三角(不包括 主对角线)中的元素均为0(或常数)。n阶下三角矩阵正好 相反,它的主对角线上方均为0(或常数),如下图 (b)所 示。
2.数组的实现机制 (1)、一维数组(n个元素)中任一元素ai的内存单元 地址 Loc(ai)=LOC(a0)+i*L (0≤i <n)
a0的内存单元地址
每个元素所需的字节个数
a0,0 a0,1 … a0,n-1 a1,0 a1,1 … a1,n-1 … … Amn= … … am-1,0 am-1,1 … am-1,n-1
………………….
an1 an2 ……..
ann
则称A为n阶对称矩阵。如下图是一个5阶对称矩阵。 1 5 1 3 7 5 0 8 0 0 1 8 9 2 6 3 0 2 5 1 a11 a21 a22 a31 a32 a33 ………………..
7 0 6 1 3
an1 an2 an3 …ann
n阶对称矩阵中的元素关于主对角线对称,故只要存储矩阵中 上三角或下三角中的元素,让每两个对称的元素共享一个存储 空间,这样,能节约近一半的存储空间。
本章学习另外两种特殊的线性表,数组和 广义表。 数组是一个数据元素的集合,元素之间具 有线性关系,但是,元素可以参与多个线性关 系(前面讲的都是参与一个); 广义表是一个数据元素的集合,元素之间 具有线性关系,但其前驱后继可以是一般元素 ,也可以是一个表。
5.1 数组的基本概念
1.数组的定义
数组是n(n>1)个相同数据类型的数据元素 a0,a1,a2,...,an-1构成的占用一块地址连续的内存单元的 有限序列。 数组中任意一个元素可以用该元素在数组中的位置来表示, 数组元素的位置通常称作数组的下标。
例:求下列广义表的长度和深度. depth(B)=max{0} +1 A=() 长度0 深度1 B=(e) 长度1 深度1 C=(a,(b,c,d)) 长度2 深度2 D=(A,B,C) 长度3 深度3
depth(C)=max{0,1}+1
depth(D)=max{1,1,2}+1
从结构上看一个广义表对应了一棵树。例如,设有如下广义表:
(a)
{{1,3,11},{1,5,17},{2,2,25}, {4,1,19},{5,4,37},{6,7,50}}
(b)
5.4 广义表
1 什么是广义表
广义表也称为列表,是线性表的一Fra bibliotek扩展,也是数据元 素的有限序列。 记作:LS= (α1, α2。。αn)。其中αi其可 以是单个元素,也可以是广义表。
注:在大多数情况下, n阶三角矩阵常数为零。
a11 a12 … a 1n c c a22 … a 2n c … a nn ……………….
a11 c
…
c c an n
a21 a22 … an1 an2 …
………………
(a)上三角矩阵
(b)下三角矩阵
假设以一维数组sa作为n阶下三角矩阵A的压缩存储单元, k为一维数组va的下标序号,aij为n阶下三角矩阵A中i行j列的 数据元素(其中1≤i,j≤n ),其数学映射关系为:
k=
i(i-1)/2+j-1
当 i ≥j
当i<j
n(n+1)/2 (或空)
注:此时一维数组sa的数据元素个数为(n(n+1)/2)+1个, 其中数组sa的最后一个位置存储A中数值不为0的那个常数。
5.3 稀疏矩阵
1.概念
(1)、稀疏矩阵 矩阵中非零元素的个数远远小于矩阵元素个数。 (2) 、稀疏矩阵压缩存储方法 只存储稀疏矩阵中的非零元素,实现方法是:将每个非 零元素用一个三元组(i,j,aij)来表示,则每个稀疏矩 阵可用一个三元组线性表来表示。
5)广义表的术语: 长度:元素个数n (注意子表是一个数据元素); 单元素:一般用小写字母表示; 子表:一般用大写字母表示; 表头:当广义表LS 非空时,称第一个元素为L的表头, 其余元素组成的表称为LS的表尾;
取广义表的表头head和表尾tail操作: 例如: B = (e) head(B)=e tail(B )=() C = (a,(b,c,d)) head(C)=a tail(C)= ((b,c,d)) D = (A,B,C) head(D)=A tail(D)= (B,C)
说明:
1)广义表的定义是一个递归定义,因为在描述广义表时又用到 了广义表; 2)在线性表中数据元素是单个元素,而在广义表中, 元素可是 以单个元素称为原子,也可以是广义表,称为广义表的子表; 3)n 是广义表长度;
4)下面是一些广义表的例子:
A = ( ) 空表,表长为0; B = (e) B中只有一个元素e,表长为1; C = (a,(b,c,d)) C的表长为2,两个元素分别为 a 和子表 (b,c,d); D = (A,B,C) D 的表长为3,它的三个元素 A,B,C 广义表;
在这个下三角矩阵中,第i行恰有i个元素,元素总数为 n(n+1)/2,这样就可将n2个数据元素压缩存储在n(n+1)/2个存 储单元中。 假设以一维数组va作为n阶对称矩阵A的压缩存储单元, k为一维数组va的下标序号,aij为n阶对称矩阵A中i行j列的数 据元素(其中1≤i,j≤n ),其数学映射关系为: k= i(i-1)/2+j-1 当i≥j j(j-1)/2+i-1 当i<j
若广义表不空,则可分成表头和表尾, 反之,一对表头和表尾可唯一确定广义表
深度:简单说就是表的嵌套层次,定义为: LS = ( dl , d2 ,… ,dn ) depth ( LS ) = max{depth(dl), depth(d2),… ,depth(dn) } + l 0 di 是单元素 depth ( di ) = l di 是空表
B = (a, b, c) C = (d) D = (B, C) = ((a, b, c), (d)) E = (D, e) = (((a, b, c), (d)), e)。
广义表E的图形表示
E D B C c d e
a
b
小结
1 广义表是数据元素的有限序列。其数据元素可以单个元素, 也可以是广义表; 2 若广义表不空,则可分成表头和表尾,反之,一对表头和 表尾可唯一确定广义表;