《数据结构(C/C++描述)》-第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表示每个元素占用的存储单元数目。
矩阵的压缩存储
• 矩阵是很多科学与工程计算问题研究的数学对象。在高级 语言程序设计中,常用二维数组来存储矩阵元素,有些程 序语言还提供了各种方便用户使用的矩阵运算。然而,对 于在数值分析中经常出现的一些阶数很高,且矩阵中有许 多值相同的元素或者是零元素的特殊矩阵,不适合用二维 数组来存放,因为这将造成大量存储空间的浪费。为了节 省存储空间,可对这类矩阵进行压缩存储,即为多个值相 同的元素只分配一个存储空间,对零元素不分配空间。
数据结构-第五章 数组与广义表-文档资料

上 三 角 矩 阵 下 三 角 矩 阵
a00 a10 a 20 an10
0 1 2
a01 a11 a21 an11
3 4
a02 a12 a22 an12
5
6 7
a0 n1 a1n1 a2 n1 an1n1
行 列 值 (row) (col) (value) 0 4 91 1 1 11 2 5 28 3 0 22 3 2 -6 5 1 17 5 3 39 6 0 16
用三元组表表示的稀疏矩阵及其转置
行 列 值 (row) (col) (value) 0 3 22 0 6 15 1 1 11 1 5 17 2 3 -6 3 5 39 4 0 91 5 2 28 行 列 值 (row) (col) (value) 0 4 91 1 1 11 2 5 28 3 0 22 3 2 -6 5 1 17 5 3 39 6 0 16
4 5 6 7 8 9 10
B a00 a01 a10 a11 a12 a21 a22 a23 … an-1n-2 an-1n-1
三对角矩阵中除主对角线及在主对角线上 下最临 近的两条对角线上的元素外,所有其它元素均为 0。总共有3n-2个非零元素。 将三对角矩阵A中三条对角线上的元素按行存放在 一维数组 B 中,且a00存放于B[0]。 在三条对角线上的元素aij 满足 0 i n-1, i-1 j i+1 在一维数组 B 中 A[i][j] 在第 i 行,它前面有 3*i-1 个非零元素, 在本行中第 j 列前面有 j-i+1 个,所 以元素 A[i][j] 在 B 中位置为 k = 2*i + j。
三对角矩阵的压缩存储
数据结构:第五章:多维数组、稀疏矩阵和广义表

浙江大学计算机学院 杨枨
数据结构
第五章
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的三元组表以判断三元组表中的每一个元素是否需要 转置。
《数据结构与算法》第五章-数组和广义表学习指导材料

《数据结构与算法》第五章数组和广义表本章介绍的数组与广义表可视为线性表的推广,其特点是数据元素仍然是一个表。
本章讨论多维数组的逻辑结构和存储结构、特殊矩阵、矩阵的压缩存储、广义表的逻辑结构和存储结构等。
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)所示。
《数据结构——用C语言描述(第二版)》第5章 数组和广义表

第五章 数组和广义表
在压缩存储时,矩阵中值相同的元素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语言中的描述
typedef int datatype;
datatype array1[N];
datatype array2[M][N];
datatype array3[X][Y][Z];
数组一旦被定义,它的维数和维界就不再改 变。因此,数组只有存取元素和修改元素值的 操作。
如何计算数组元素的地址?
按上述两种方式顺序存储的序组,只要知道:
开始结点的存放地址(即基地址), 维数 每维的上、下界 每个数组元素所占用的单元数,
就可以将数组元素的存放地址表示为其下标的线性函 数。因此,数组中的任一元素可以在相同的时间内存 取,即顺序存储的数组是一个随机存取结构。
整理课件
整理课件
)
2
n(n1),当ij,即下三角阵中的常数 2
3.三对角矩阵
1
1
1 1 0 0 0 如何确定一维数组的大小? 2
23700
N3n2
3
04530
7
0 0 6 7 5 如何确定元素Aij在一维数 4
0 0 0 8 9 组中的位置?
5
3
在Aij之前有i行,共有3*i-1个非零元素,
6
在第i行, aij之前有j-i+1个非零元素,
(4) A.195 B.196 C.197
D.198
整理课件
5.2.3 稀疏矩阵的压缩存储 顺序存储:三元组表 链式存储:十字链表
整理课件
1.三元组表存稀疏矩阵
12005
03000 M=5
04000
N=5
T=7
数据结构 第5章 矩阵和广义表

a[0,0] a[0,1] ... a[0,n-1] a[1,0] a[1,1] ... a[1,n-1] ... a[m-1,0] a[m-1,1] ... a[m-1,n-1] A(m-1) A(1) A(0)
a a+L ... a+(m-1)L a+mL a+(m+1)L ... a+(m+m-1)L ... a+((n-1)*m)L a+((n-1)*m+1)L ... a+((n-1)*m+m-1)L
5.2 数组的表示和实现
内存位置 a a+(1*C) a+(2*C) a+(3*C) a+(4*C) … a+(5*C)
a[0] a[1] a[2] a[3] a[4] ... a[n]
数组名 A[0] A[1] A[2] A[3] A[4] … A[n]
一维数组在内存中的表示
a a+L ... a+(n-1)L a+nL a+(n+1)L ... a+(n+n-1)L ... a+((m-1)*n)L a+((m-1)*n+1)L ... a+((m-1)*n+n-1)L
i≥ j i< j
5.3.2 5.3.2稀疏矩阵
解决稀疏矩阵压缩存储的目标是: 尽可能减少或不存储零值元; 尽可能不作和零值元进行的运算; 便于进行矩阵运算,即易于从一对行列号(i,j)找 到矩阵的元,易于找到同一行或同一列的非零值元。
1 0 0 0 0 0 0 0 20 0 0 0 0 0 0 30 0 0 60 0 0 0 0 50 0 0 40 0 0 0 0 0 0 0 0 0 70
第五章 多维数组和广义表

通常把与树对应的广义表称为纯表,它限制了表中成 分的共享和递归;把允许结点共享的表称为再入表;而把 允许递归的表称为递归表。它们之间的关系满足:递归表 再入表 纯表 线性表。 广义表三个特殊的基本运算:取表头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)。
中国水利水电出版社
11
Data Structures: Chapter 5
设二维数组 A 具有m 行 n列, 借助矩阵形式给出如下:
a00 a01 a11 a0 n-1 a1 n-1 am-1 n-1 a10
Amn=
am-1 0 am-1 1 以行为主序的存储方式: 0 1 … n-1 n n+1 … 2n-1 a00 a01 a0n-1 a10 a11 a1n-1
若以列序为主序的方式存储二维数组,则元素aij 的 存储位置可由下式确定:
Loc( i, j ) = Loc ( 0, 0 ) +(mj+i )L
中国水利水电出版社
13
Data Structures: Chapter 5
无论规定行优先或列优先,只要知道以下3 要素,便可随时求出任一元素的地址。 这样数组中的任一元素便可以随机存取!
中国水利水电出版社
10
Data Structures: Chapter 5
以“行序为主序”的存储映象
例如:
a0,0 a0,1 a0,2 a1,0 a1,1 a1,2
a0,0 a0,1 a0,2 a1,0 a1,1 a1,2
L
二维数组A中任一元素aij 的存储位置
LOC( i, j ) = LOC(0,0) + ( 3×i+j )×L
对稀疏矩阵三元组表的不同的存储 方法,对应稀疏矩阵不同的压缩存储方 法。常见的有:
一、三元组顺序表
中国水利水电出版社
3
Data Structures: Chapter 5
5.1.1 数组的定义 数据对象:
D = { aij | 0≤i≤b1-1, 0 ≤j≤b2-1 } 数据关系:
R = { ROW, COL }
ROW= b 1= m b2= n
{< ai,j , ai+1,j >| 0≤i≤b1-2, 0≤j≤b2-1}
… am-10 am-11
mn-1 am-1n-1
以列为主序的方式: 0 1 … m-1 m m+1 … 2m-1 … a00 a10 am-10 a01 a11 am-11 a0n-1 a1n-1
中国水利水电出版社
nm-1 am-1n-1
12
Data Structures: Chapter 5
数组元素存储地址的计算
a00 a01 a11 a0 n-1 a1 n-1 am-1 n-1 a10
Amn=
am-1 0 am-1 1
① 开始结点的存放地址(即基地址) ② 维数和每维的上、下界; ③ 每个数组元素所占用的存储单元数
中国水利水电出版社
14
Data Structures: Chapter 5
若是n 维数组,其中任一元素的地址该如何计算? 教材已给出低维(行优先)优先的地址计算公式。 见 (5-2)式,该式称为 n 维数组的映像函数。
a11 a11 c a11 …… c c … a 1n … a 1n ……….. … a nn a11 c … c a21 a22 … c ………… …. an1 an 2 … an n (b)下三角矩阵
(a)上三角矩阵
下(上)三角矩阵的存储和对称矩阵类似。
中国水利水电出版社
19
Data Structures: Chapter 5
(行关系和列关系)的约束: a11 a12 … a1n a21 a22 … a2n … … …… am1 am2 … amn 一个 m×n 的二维数组可以 看成是m 行的一维数组,或 者是 n 列的一维数组。
Amn=
n N 维数组的特点: 个下标,每个元素受到 n 个关系约束 一个 n 维数组可以看成是由若干个 n-1 维数组组成的线性表。
通常认为:
t m n
≤ 0.05 的矩阵为稀疏矩阵。
中国水利水电出版社
22
Data Structures: Chapter 5
以常规方法--二维数组来表
示高阶的稀疏矩阵时有以下问题: (1) 零值元素占了很大空间;
(2) 计算中进行了很多和零值的运算,
遇除法,还需判别除数是否为零。
中国水利水电出版社
0 0 12 9 0 0 0 0 3 0 0 0 M 0 0 24 0 0 18 0 0 15 0 0 7
中国水利水电出版社
26
Data Structures: Chapter 5
存储原则:只存矩阵的行、列数和每个非零元 的行、列下标及其值。
0 0 12 9 0 0 0 0 3 0 0 0 M 0 0 24 0 0 18 0 0 15 0 0 7 0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 0 67 0 0
Data Structures: Chapter 5
中国水利水电出版社
1
Data Structures: Chapter 5
5.1 多维数组 5.2 特殊矩阵 5.3 稀疏矩阵
5.4 广义表
中国水利水电出版社
2
Data Structures: Chapter 5
5.1 多维数组
一维数组的特点: 1个下标,ai 是ai+1的直接前驱 二维数组的特点: 2个下标,每个元素ai,j 受到两个关系
k=0
a21
1
a22
2
a31
3
a32
4
a33
5
…… 当i≥j 当i< j
an, n
…. …. n(n+1)/2-1
K=
中国水利水电出版社
i ( i -1) / 2 + j-1 j ( j -1) / 2 + i-1
18
Data Structures: Chapter 5
2. 三角矩阵 上三角或下三角。
中国水利水电出版社17 NhomakorabeaData Structures: Chapter 5
以存储下三角矩阵中元素为例,第i 行恰有i 个元 素,元素总数为:n(n+1)/2。 因此,可将这些元素存放在一个向量(一维数组) sa[0..n(n+1)/2-1]中。 为了便于访问对称矩阵A中的元素,我们必须在aij 和 sa[k]之间找一个对应关系。 a11
数据关系:
R={ R1, R2, ..., Rn } Ri={<aj ,..., j ,..., j , aj ,..., j ,..., j > | 0 ≤ jk ≤ bk -1, 1≤ k ≤n 且 k i, 0≤ ji ≤bi -2, i =1,...,n }
1 i n 1 i+1 n
基本操作: }
中国水利水电出版社
16
Data Structures: Chapter 5
•
• • • • • • •
5.2 特殊矩阵
--非零元素或零元素的分布有一定规律的矩阵。 1. 对称矩阵 --在一个 n 阶方阵A中,若元素满足下述性质: aij = aji 1≤i, j≤n 则称 A 为对称矩阵。 只要存储矩阵中上三角或下三角中的元素,让 每两个对称的元素共享一个存储空间,这样,能节 约近一半的存储空间。
有两类矩阵适合压缩存储:
(1) 特殊矩阵
非零元在矩阵中的分布有一定规则. 例如:对称矩阵、三角矩阵。
(2) 随机稀疏矩阵
非零元在矩阵中随机出现。
中国水利水电出版社
25
Data Structures: Chapter 5
例如:如下稀疏矩阵
M --非零元个数<<m×n
0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 0 67 0 0
an-1 n an n
对角矩阵,可按行为主序或对角线的顺序,将 其压缩存储到一个向量中,并且也能找到每个非零 元素和向量下标的对应关系。
中国水利水电出版社
21
Data Structures: Chapter 5
5.3 稀疏矩阵
假设 m 行 n 列的矩阵含 t 个非零元 素,则称表达式 的值为稀疏因子。
COL
= {< ai,j , ai,j+1 >| 0≤i≤b1-1, 0≤ j≤b2-2}
4
中国水利水电出版社
抽象数据类型多维数组的定义
ADT Array
{ 数据对象:
Data Structures: Chapter 5
D={aj
1
j 2, ..., j i..., j n| ji
= 0,...,bi -1, i =1,2, ....,n }
中国水利水电出版社
5
Data Structures: Chapter 5
基本操作:
1. 构造多维数组
InitArray(&A, n, bound1, ..., boundn) 操作结果: 若维数 n 和各维长度合法,则构 造相应的数组 A,并返回OK。
中国水利水电出版社
6
Data Structures: Chapter 5
称为 三元组
例如: M 的存储,由矩阵的行列数(6,7)和 三元组表: ((1,2,12),(1,3,9),(3,1,-3),(3,6,14), (4,3,24),(5,2,18), (6,1,15), (6,4,-7)) 惟一确定。
中国水利水电出版社
27
Data Structures: Chapter 5
23
Data Structures: Chapter 5
解决问题的原则:
(1) 尽可能少存或不存零值元素;
(2) 尽可能减少没有实际意义的运算;
(3) 操作方便; 如: 能尽可能快地找到 与下标值 (i, j) 对应的元素; 能尽可能快地找到 同一行或同一列的非零值元;