第五章 多维数组与广义表

合集下载

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

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

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

数组和广义表

数组和广义表

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版)-电子教案 第五章 维数组和广义表

数据结构(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语言描述(第二版)》第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

第五章 数组与广义表

第五章 数组与广义表

第五章数组、特殊矩阵和广义表本章介绍的数组与广义表可视为线性表的推广,其特点是数据元素仍然是一个表。

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

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

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

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

标识,因此,在数组上不能做插入、删除数据元素的操作。

通常在各种高级语言中数组一旦被定义,每一维的大小及上下界都不能改变。

在数组中通常做下面两种操作:(1)取值操作:给定一组下标,读其对应的数据元素。

(2)赋值操作:给定一组下标,存储或修改与其相对应的数据元素。

我们着重研究二维和三维数组,因为它们的应用是广泛的,尤其是二维数组。

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

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

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

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

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

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

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

多维数组和广义表

多维数组和广义表

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的存储地址。

第5章数组广义表

第5章数组广义表

am-1,n-1
Loc(aij) = b+( aij前元素个数)•L= b+[i×n+j]×L( 存储器)
例5-1 设二维数组A[7][8],起始地址b=1000,每个元素所占单元量L=3, 则Loc(a5,6)=1000+(5•8+6)3 = 1138。
数组元素的地址计算
3.三维数组: aijk ai00 aij0
数组元素的地址计算
4.n 维数组 从以上的地址公式推导中得出这样一条规律: 任意维数组中任一元素的地址= 起址b+ 该元素前的个数×元素单元量L。 故n维数组A[u1][u2]…..[un],其中任一元素ai1....in的地址为:
Loc(ai1i2……in)=b+(i1•u2•u3• … •un+i2•u3•u4• …un+…+in-1•un+in)•L =b+(

A[i]
A(2) = A[m][n] =
ai0 ai1 …… aij ….… ain-1
………………………….

A[m-1]
am-10 am-11 …am-1j … am-1n-1
= (A[0]……A[i]……A[m-1] )-----线性表形式
2.数组的基本运算
多维数组是线性表的推广,而线性表是多维数组的特例。 在算法语言中,数组一旦生成,其元素的存储空间就固定下来,故数组 的运算一般不包括插入和删除这样的操作。对数组运算有: (1) 构造一个n维数组:Setarray(A,n,d1d2,......dn),即生成: A[d1][d2].....[dn](C语言中,1≤n≤8)。 (2) 撤消一个数组:Dearray(A),释放数组A的存储空间。 (3) 取值:Aget(A,i1,...,in,x),将A[i1][i2],...,[in]的值传给变量 x。 (4) 赋值:Assign(A,i1,...,in,x),将变量 x的值传给A[i1][i2].....[in]。

5多维数组和广义表

5多维数组和广义表

第五章多维数组和广义表本章要点:·多维数组的概念极其表示方法·特殊矩阵和稀疏矩阵·广义表的存储5.1多维数组a11a12……a n1Am×n= a21a22……a n2……………………a m1a m2……a mn5.2数组的顺序表示数组可以以行为主序,也可以以列为主序。

设每个数组的元素占t个存储单元,数组的下标从1开始,则元素a ij的位置可以由下式确定:Loc(a ij)=Loc(a11)+[(i-1)*n+j-1]*t其中:a11称为基地址。

在C语言中,数组的下标从0开始,则元素a ij的位置可以由下式确定:Loc(a ij)=Loc(a00)+(i*n+j)*t其中:a00称为基地址。

5.3矩阵的压缩存储5.3.1特殊矩阵1.对称矩阵若一个n阶方阵A的元素满足下述性质:a jia1≤i,j≤n ,称为对称矩阵。

ij由于元素的对称性,一对对称元素只分配一个存储空间即可,这样n2个元素只须n(n+1)/2空间即可。

如:4 7 0 27 0 0 3 0 0 9 52 3 5 1一般按行优先存储的下三角矩阵如下:a11An ×n= a 21 a 22 …………… a n 1 a n 2 ……a nn所以将一个二维数组a[i][j]存储在一个一维数组 sa[k]中的对应关系如下:{2)1(2)1(j i j i i j i i j j k ≥+-<+-=当当其中:k 是一维数组sa 的下标。

2.三角矩阵一般下三角矩阵如下:a11c …… cAn ×n= a 21 a 22 …… c ………………… a n 1 a n 2 ……a nna[i][j]和sa[k]的对应关系如下:{1)22(2112)1(ji i j i n i j i n n k ≤+-++-->++=当当一般上三角矩阵如下:a11a 12 ……a n 1An ×n= c a 22……a n 2 ………………… c c …… a nna[i][j]和sa[k]的对应关系如下:{2)1(12)1(j i j i i j i n n k ≥+-<++=当当 5.3.2 稀疏矩阵当矩阵中非0元素远远少于0元素,而且分布没有规律,称为稀疏矩阵。

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

第五章数组和广义表讲课提要【主要内容】1.多维数组的顺序存储结构2.特殊矩阵的压缩存储3.广义表的定义及其与线性表的关系4.广义表的存储结构5.广义表运算实现中递归的应用【教学目标】1.掌握多维数组的顺序存储结构2.掌握特殊矩阵的压缩存储方法3.掌握广义表的定义及其与线性表的关系4.掌握广义表的存储结构5.了解广义表运算实现中递归的应用学习指导1.多维数组的顺序存储结构对于多维数组,有两种存储方式:一是以行为主序(或先行后列)的顺序存放,如BASIC、PASCAL、C等程序设计语言中用的是以行为主的顺序分配,即一行分配完了接着分配下一行。

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

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

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

不论按何种方式存储,只要确定了数组的首地址以及每个数组元素所占用的单元数,就可以将数组元素的存储地址表示为其下标的线性函数。

设有m×n二维数组A mn,以“以行为主序”的分配为例,按照元素的下标确定其地址的计算方法如下。

设数组的基址为LOC(a11),每个数组元素占据L个地址单元,计算a ij 的物理地址的函数为:LOC(a ij) = LOC(a11) + ( (i-1)*n + j-1 ) * L同理,对于三维数组A mnp,即m×n×p数组,对于数组元素a ijk其物理地址为:LOC(a ijk)=LOC(a111)+( ( i-1) *n*p+ (j-1)*p +k-1) )*L注意:在C语言中,数组中每一维的下界定义为0,则:LOC(a ij) = LOC(a00) + ( i*n + j ) * L【例4-1】二维数组A的每一个元素是由6个字符组成的串,其行下标i=0,1,…,8,列下标j=1,2,…,10。

数据结构与算法多维数组与广义表

数据结构与算法多维数组与广义表
对于列号相同者,先存储行号较小者。设二维数组的行下 标与列下标变化范围分别为闭区间[l1, h1]与[l2, h2],按列存 储,每个元素占c个存储单元,则它的任一元素ai, j的相对地 址计算公式为Loc(ai, j)=((j–l2)(h1l1+1)+(il1))×c。对二维数 组,还可有其他的二维向一维的映射方法,如按正对角线、 反对角线等,这里不作讨论。
数组
• 3. 多维数组 • 下面将二维数组推广到多维数组,对n维数组也采用两种存
储映射方式,即二维数组的按行存储与按列存储的推广。 按行存储和按列存储都是一种“左”下标优先的存储方法, 即第1个(最左)下标的下标值较小的元素较先存储,对于 第1个下标值相同者,按第2个下标优先存储,对任意的k> 1,对第1~(k–1)维相同者,先存储第k维中下标值较小者。
数组
• 数组的存储结构与寻址问题 • 数组是一种特殊的数据结构,一般要求元素的存储地址能
根据它的下标(即逻辑关系)计算出来,因此数组一般只 采用顺序存储结构。讨论数组元素地址时,一般将第1个元 素的起始存储单元作为参考单元,参考单元的绝对地址称 为该数组的首地址,数组其他元素的相对地址均相对于首 元素的起始地址。设i1, i2,…, in为某n维数组中的一个元素的 下标,则用Loc( ai1,i2,L ,in )表示此元素的相对地址。 • 对一维数组,与线性表类似,可使用顺序存储方式;但对 多维数组,由于其已不属于线性结构的范畴,因此不能直 接使用顺序存储方式。但多维数组有其特殊性,具有线性 结构的痕迹,它可唯一地转换为一维结构,并可根据元素 的存储位置推算出元素的逻辑关系(下标),所以可将多 维数组映射为一维结构,然后使用顺序存储方式。
数组
• 1. 一维数组 • 一维数组的每个元素只含一个下标,其实质上是一个线性

数据结构第五章(多维数组与广义表)串讲+复习要点

数据结构第五章(多维数组与广义表)串讲+复习要点

数据结构第五章多维数组和广义表第五章多维数组和广义表5.1多维数组一般用顺序存储的方式表示数组。

常用方式有:1)行优先顺序,将数组元素按行向量排列;2)列优先顺序,将数组元素按列向量排列。

计算地址的函数:LOC(Aij)=LOC(Ac1c2)+((i-c1)*(d2-c2+1)+j-c2)*d5.2矩阵的压缩存储为多个非零元素分配一个存储空间;对零元素不分配存储空间。

1.对称矩阵在一个n阶的方阵A中,元素满足Aij=Aji 0<=i,j<=n-1;称为对称矩阵。

元素的总数为:n(n+1)/2;设:I=i或j中大的一个数;J=i或j中小的一个数;则:k=I*(I+1)/2+J;地址计算:LOC(Aij)=LOC(sa[k])=LOC(sa[0])+k*d= LOC(sa[0])+ (I*(I+1)/2+J )*d 2.三角矩阵以主对角线划分,三角矩阵有上三角和下三角;上三角的主对角线下元素均为常数c;下三角的主对角线上元素均为常数c。

元素总数为:(n(n+1)/2)+1;以行优先顺序存放的Aij与SA[k]的关系:上三角阵:k=i*(2n-i+1)/2+j-i;下三角阵:k=i*(i+1)/2+j;3.对角矩阵所有的非零元素集中在以主对角线为中心的带状区域,相邻两侧元素均为零。

|i-j|>(k-1)/2以行优先顺序存放的Aij与SA[k]的关系:k=2i+j;5.2.2稀疏矩阵当矩阵A中有非零元素S个,且S远小于元素总数时,称为稀疏矩阵。

对其压缩的方法有顺序存储和链式存储。

1.三元组表将表示稀疏矩阵的非零元素的三元组(行号、列号、值)按行或列优先的顺序排列得到的一个结点均是三元组的线性表,将该表的线性存储结构称为三元组表。

其类型定义:#define maxsize 10000typedef int datatype;typedef struct{int i,j;datatype v;}trituplenode;typedef struct{trituplenode data[maxsize];int m,n,t;}tritupletable;2.带行表的三元组表在按行优先存储的三元组表中加入一个行表记录每行的非零元素在三元组表中的起始位置。

第五章 多维数组与广义表

第五章   多维数组与广义表

单元,且以行为主序存储,则元素a[2,1]相对于数组
空间起始地址的偏移量是___(40)___。
(40)A.5
B.10
C.15
D.25
2019
设数组a[3..16,5..20]的元素以列为主序存放,每个元 素占用两个存储单元,则数组元素a[i,j](3≤i≤16, 5≤j≤20)的地址计算公式为___(11)___。
(11)A.a-118+2i+28j B.a-116+2i+28j
C.a-144+2i+28j
D.a-146+2i+28j
2019
二维数组 X 的行下标范围是0~5,列下标范围是1~8,每 个数组元素占六个字节,则该数组的体积为__(6)__个字节, 若已知 X 的最后一个元素的起始字节地址为382,则 X 的 首地址(即第一个元素的起始字节地址)为 __(7)__,记为 Xd 。若按行存储,则 X{1,5] 的起始地址是 __(8)__, 结束字节 地址是 __(9)__。若按列存储,则 X[4,8]的起始字节地址为 __(10)__。
120 030 040 006
Aij=Bji
1000 2340 0006
M=4 N=2
i j Ai
T=5
j
00 1
01 2
11 3
21 4
M=2 N=4
i j Bi
T=5
j
00 1
01 2
11 3
21 4
思想一:直接交换a.data中i和j的内容
在编程时,简单而又自然的方法,是将矩阵描述为 一个二维数组。矩阵在这种存储表示之下,可以对 其元素进行随机存取。

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

第5章 数组和广义表总结

第5章 数组和广义表总结

0603
2090
B5×4 = 0 8 0 0
0000
row col val
4000
0 12
0 44
1 06
1 28
2 19
3 03
现在,要通过A的 三元组表求其转置 矩阵B的三元组表。
row col val
0 16 0 33 1 02 1 29 2 18 4 04
16
三元组表的转置
方法1:设矩阵A是m行、n列、t个非0元素 从头到尾扫描A,将第0列的元素依次放入B(行号列号互换); 从头到尾扫描A,将第1列的元素依次放入B(行号列号互换); ...... 从头到尾扫描A,将第n-1列的元素依次放入B(行号列号互换); 扫描A几趟? 矩阵A的列数n
}tritype;
typedef struct { //三元组表
tritype data[MAXSIZE]; //三元组表存储空间
int mu, nu, tu;
//原矩阵的行数、列数、非0元素个数
}Tsmtype, *Tsmlink;
//三元组表说明符
14
三元组表
例 5.3 矩阵的转置。 求矩阵A的转置矩阵B,算法很简单:
ArrayInit(&A, n, d1, d2, ..., dn) ArrayDestroy(&A)
ArrayGet(A, i1, ..., in, &e)
ArrayAssign(&A, i1, ..., in, e) }ADT Array;
数组的基本操作一般不包括插入和删除
4
5.2 数组的存储结构
存储空间是在程序执行时动态分配的
n维数组A[u1][u2]…[un]

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

数据结构 第五章 多维数组和广义表
) ( ( )
(
)
数组特点
• 数组结构固定 • 数据元素同构
数组运算
• 给定一组下标,存取相应的数据元素 • 给定一组下标,修改数据元素的值
数组的两种顺序存储结构

以行序为主序(行优先顺序) 以列序为主序(列优先顺序)
按行序为主存放
a11 a12 ……..
a1n
a21 a22 …….. am1 am2 ……..
Loc(aij)=Loc(a00)+[i(i+1)/2+j]*d
i (i 1) / 2 j,当 i j k n(n 1) / 2, 当i j
三角矩阵(上三角)
a00 a01 a02 …….... a0,n-1
c a11 a12 ……. a1,n-1 c c an-1,n-1
k (3i 1) ( j i 1) 2i j
2i j,当| i j | 2 k 0,当 | i j | 1
5.2.2 稀疏矩阵
定义:若矩阵的非零元素个数远远少于它的零元素个数,且 非零元素的分布没有一定规律,则该矩阵为稀疏矩阵。
0 12 9 0 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
按行序为主序:
an-1n-1
a00 a10 a11 a20 a21 a22 …….. an-10 ……… an-1n-1 k=0 1 2 3 4 5 n(n-1)/2 n(n+1)/2-1
i (i 1) / 2 j,当 i j k j ( j 1) / 2 i, 当i j
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

关键问题
如何确定一维数组的大小? = 所需空间
如何确定矩阵元素在一维数组中的位 1 置?从而保证对矩阵元素的随机存取 2
Aij的位置 = 该元素前的元素个数 3 3
12345
4
23456
5
4
34567
5
45678
6
56789
7

1 . 对称矩阵
1
1 2 3 4 5 如何确定一维数组的大小? 2
8
9
程序员试题
2019-1 对矩阵压缩存储的主要目的是__(5)__。 (5) A.方便运算 B.节省存储空间
C.降低计算复杂度 D.提高运算速度
2019 将一个三对角矩阵A[l..100,1..100]中的元素按行 存储在一维数组B[l..298]中,矩阵A中的元素A[66,65]在 数组B中的下标为___(4)___。
行指针
029000 0 1^
000000 2
-3 0 0 0 0 4 3 0 0 24 0 0 0 4
5
0 18 0 0 0 0
0 12
2 0 -3 ^ 3 2 24 ^ 4 1 18 ^ 5 0 15 ^
0 29^ 2 54^
5 3 -7 ^
15 0 0 -7 0 0
3.十字链表
i
j Val/Next
a a m-1 0 m-1 1 ……
a m-1 n-1
内存
a0
0 …
a0
n
a1
0
… a1
n

假设数组各维的下界是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
多维数组
把三维以上的数组称为多维数组, 可有多个直接前驱和多个直接后继 是一种非线性结构。
在C语言中的描述
typedef int datatype;
datatype array1[N];
datatype array2[M][N];
datatype array3[X][Y][Z];
数组一旦被定义,它的维数和维界就不再改 变。因此,数组只有存取元素和修改元素值的 操作。
压缩存储的办法: 只存非零元素。
所需空间:与非零元素的个数和 存储方式有关。
5.2.2 特殊矩阵的压缩存储
矩阵类型 对称矩阵 三角矩阵 对角矩阵
压缩的基本思想:
只存有用的元素 由用二维数组改为用一维数组来存放
说明:
按C语言中规定,下标从0开始 不失一般性,按“行优先顺序”存储
5.2 多维数组的存储
考虑问题的基本出发点:
计算机的内存结构是一维的。因此用一维内存来存多 维数组,就必须按某种次序将数组元素排成线性序列。
数组一旦建立,结构中的元素个数和元素间的关系就 不再发生变化。因此,一般都是采用顺序存储的方法 来表示数组。
两种顺序存储方式
行优先顺序——将数组元素按行排列
32 6
思想一:直接交换a.data中i和j的内容
问题:b.data是一个按列优先顺序存储的稀疏矩阵B
0 2 0 0 Aij=Bji 0 7
056
250
700
060
2.利用三元组表实现转置
120 030 040 006
Aij=Bji
1000 2340 0006
M=4 N=2
i j Aij
T=5
00 1
01 2
11 3
21 4
32 6
M=2 N=4
i j Bij
T=5 0 0 1
01 2
11 3
21 4
23456 34567
N n(n1) 2
3 3 4
4 5 6 7 8 设:存放下三角阵中的元素, 5
5 6 7 8 9 则:如何确定元素Aij在一维 4
数组中的位置?
5
6
i(i1)j 2
当ij,Aij在下三角阵中
Loc(A ) ij
j( j1)i 2
当ij,Aij在上三角阵中 (根据AijAji)
为了节省存储空间, 我们可以对这类矩阵进行压缩 存储。
5.2.1 几种常见的特殊矩阵
对称矩阵
12345 23456
在一个n阶方阵A中,若元素满足下
述性质:aij=aji 0≦i,j≦n-1,则称A 为对称矩阵。
34567 45678 56789
特征:元素关于主对角线对称
压缩存储的办法: 只存矩阵中上三角或下三角中
如何计算数组元素的地址?
按上述两种方式顺序存储的序组,只要知道:
开始结点的存放地址(即基地址), 维数 每维的上、下界 每个数组元素所占用的单元数,
就可以将数组元素的存放地址表示为其下标的线性函 数。因此,数组中的任一元素可以在相同的时间内存 取,即顺序存储的数组是一个随机存取结构。
如何计算数组元素的地址? 内存
最基本的原理
Ai1…in的起始地 址
=
第一个元素 的起始地址

该元素前面 的元素个数

单位 长度
程序员试题
2019-1
对于二维数组a[0…4,1…5],设每个元素占1个存储单
元,且以行为主序存储,则元素a[2,1]相对于数组空
间起始地址的偏移量是___(40)___。
(40)A.5
B.10
C.15
所有的非零元素集中在以主对角线 为中心的带状区域中,
即除了主对角线和主对角线相邻两 侧的若干条对角线上的元素之外, 其余元素皆为零。
压缩存储的办法: 只存对角线上的元素。
存三对角矩阵所需的空间:
N3n2
稀疏矩阵
12005 03000 04000 00600 00080
特征:只有少量非零元素,且非 零元素的分布没有规律。
(6): A.210 (7): A.0 (8): A.Xd+24 (9): A.Xd+29 (10):A.Xd+186
B.240
C.288
B.6
C.94
B.Xd+72 C.Xd+78
B.Xd+77 C.Xd+83
B.Xd+234 C.Xd+270
D.294 D.100
D.Xd+144 D.Xd+147
在PASCAL、C语言中,数组就是按行优先顺序存储的。
列优先顺序——将数组元素按列向量排列
在FORTRAN语言中,数组就是按列优先顺序存储的。
推广到多维数组的情况:
行优先顺序:先排最右下标,从右到左,最后排最左下标 列优先顺序:先排最左下标,从左向右,最后排最右下标。
计算机如何实现数组元素的随机存取?
(4) A.195 B.196 C.197 D.198
5.2.3 稀疏矩阵的压缩存储 顺序存储:三元组表 链式存储:十字链表
1.三元组表存稀疏矩阵
12005
03000 M=5
04000
N=5
T=7
00600
00080
考虑:
只存非零元素
一个非零元素的必需信息有: (i, j, aij)
记录一个稀疏矩阵的必需信息有: 行数M,列数N,非零元素个数T
D.Xd+276
(6)C (7)D (8)B (9)B (10)D
5.2 矩阵的压缩存储
在编程时,简单而又自然的方法,是将矩阵描述为 一个二维数组。矩阵在这种存储表示之下,可以对 其元素进行随机存取。
但是在一些特殊矩阵中,非零元素呈某种规律分布 或者矩阵中有大量的零元素,如果仍用二维数组存, 会造成极大的浪费,尤其是处理高阶矩阵的时候。
D.25
2019
设数组a[3..16,5..20]的元素以列为主序存放,每个元素 占用两个存储单元,则数组元素a[i,j](3≤i≤16,5≤j≤20)的 地址计算公式为___(11)___。
(11)A.a-118+2i+28j
B.a-116+2i+28j
C.a-144+2i+28j
D.a-146+2i+28j
i j Aij 00 1 01 2 04 5 11 3 21 4 32 6 43 8
三元组表的C语言描述
#define maxsize 10000
typedef int datatype; typedef struct{ /*三元组结点*/
i jV
int i,j;
datatype v;
}TriTupleNode;
有一个直接前驱和一个直接后继
二维数组
二维数组可以看成是向量的推广。
有两个直接前驱和两个直接后继
a 00
a 01
……
a 0n-1
a 10
a 11
……
a 1n-1
………………………….
A=
a m -1 0
a m -1 1 … …
a m -1 n-1
三维数组 最多可有三个直接前驱和三个直接后继
的元素。
所需空间:Nn1(i1)n(n1)
i0
2
三角矩阵
12345 03456 00567 00078 00009
12345 43456 44567 44478 44449
10000 23000 36500 47970 58129
14444 23444 36544 47974 58129
相关文档
最新文档