第五章 多维数组和广义表

合集下载

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

数据结构第五章 数组与广义表
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 多维数组在计算机内的存放 由于计算机的内存结构是一维的,因此用一维内存来表示 多维数组,就必须按某种次序将数组元素排成一序列,然后 将这个线性序列存放在存储器中。又由于对数组一般不做插 入和删除操作,也就是说,数组一旦建立,结构中的元素个 数和元素间的关系就不再发生变化。因此,一般都是采用顺 序存储的方法来表示数组。

第五章 数组与广义表

第五章 数组与广义表

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

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

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个非零元素,

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

按列优先存储的寻址方法与此类似。
数据结构(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. 一维数组 • 一维数组的每个元素只含一个下标,其实质上是一个线性

第五章 多维数组与广义表

第五章   多维数组与广义表

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

05、第五章 数组和广义表-t

05、第五章 数组和广义表-t

jv
非零元值
7 80
2 12 1 3 92
矩阵列数和 非零元个数
1 -3 3
6 14 4
0 12 9 0 0 0 0
3 24 5
0
00
0 0 0 0
2 18 6 M = − 3 0 0 0 0 14 0
1 15 7
0 0 24 0 0 0 0
4 -7 8
0 18 0 0 0 0 0
15 0 0 − 7 0 0 0 6×7
a21 a22 … a2n A= … … … … …
am1 am2 … amn
(a) 矩阵表示形式
(b) 列向量的一维数组形式
A=
a11 a21 ┆
a12 a22 ┆
┆ ┆
a1n a2n ┆
am1 am2 ┆ amn
(c) 行向量的一维数组形式 图5-1 二维数组图例形式
5.2 数组的顺序表示和实现
对于高阶矩阵,若其中非零元素呈某种规律分布或 者矩阵中有大量的零元素,若仍然用常规方法存储, 可能存储重复的非零元素或零元素,将造成存储空间 的大量浪费。对这类矩阵进行压缩存储:
◆ 多个相同的非零元素只分配一个存储空间; ◆ 零元素不分配空间。
对称矩阵
a11 a12 …. … ….. a1n a21 a22 …….. ……. a2n
◆ 数组中的数据元素具有相同数据类型。 ◆ 数组是一种随机存取结构,给定一组下标,就可以访问与其 对应的数据元素。 ◆ 数组中的数据元素个数是固定的。
5.1.1 数组的抽象数据类型定义
1、抽象数据类型定义
ADT Array{
数据对象:ji= 0,1,…,bi-1 , 1,2, …,n ; D = { aj1j2…jn | n>0称为数组的维数,bi是数组第i维的长度,ji 是数组元素第i维的下标,aj1j2…jn∈ElemSet } 数据关系:R = {R1, R2, …, Rn} Ri={<aj1j2 …ji…jn , aj1j2 …ji+1…jn>|0≦jk≦bk-1 , 1≦k≦n且k≠i,0≦ji≦bi-2, aj1j2 …ji+1…jn∈D } 基本操作: ……

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

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

以行序为主序(行优先顺序) 以列序为主序(列优先顺序)
按行序为主存放
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)。

通常把与树对应的广义表称为纯表,它限制了表中成 分的共享和递归;把允许结点共享的表称为再入表;而把 允许递归的表称为递归表。它们之间的关系满足:递归表 再入表 纯表 线性表。 广义表三个特殊的基本运算:取表头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的存储地址。
(2)L=(a,b) GetHead(L)=a GetTail(L)=(b) Length(L)=2 (3) A=(x,L)=(x,(a,b)) GetHead(A)=x GetTail(A)=(L)=((a,b)) Length(A)=2 (4) B=(A,y)=((x,(a,b)),y) GetHead(B)=A=(x,(a,b)) GetTail(B)=(y) Length(B)=2
2.十字链表 稀疏矩阵的链接存储是一种既带行指针又带列指针 的链接存储结构。 对稀疏矩阵的链接存储就是对其相应的三元组线性 表进行链接存储,链接表中的每一个结点表示一个非零 元素的三元组,第一个结点既处于同一行的单链表中, 又处于同一列的单链表中,即处于所在行的单链表和所 在列的单链表的交点处,整个稀疏矩阵由十字交叉链表 结构组成,故称十字链表。
第五章 多维数组和广义表
一、课程内容 5.1 多维数组 5.2 矩阵的压缩存储 5.3 广义表的概念 二、学习目的与要求 本章的目的是介绍多维数组的逻辑结构特征及其 存储方式,特殊矩阵和稀疏矩阵的压缩存储方法及广 义表的概念。本章重点是熟悉多维数组的存储方式、 矩阵的压缩存储方式、广义表的定义及其求表头和表 尾的运算,难点是稀疏矩阵的压缩存储表示下实现的 算法。
设矩阵Amn中有s个非零元素,若s远远小于矩阵元 素的总数(即s<<m×n),则称A为稀疏矩阵。 当用三元组来表示非零元时,对稀疏矩阵进行压缩 存储通常有两类方法:顺序存储和链式存储。 1.三元组表 若将表示稀疏矩阵的非零元素的三元组按行优先 (或列优先)的顺序排列(跳过零元素),则得到一个 其结点均是三元组的线性表,我们将该线性表的顺序存 储结构称为三元组表。 (见图5-6)
(5)C=(A,B)=((x,(a,b)),((x,(a,b)),y)) GetHead(C)=A=(x,(a,b)) GetTail(C)=(B)=(((x,(a,b)),y)) Length(C)=2
(6)D=(a,D)=(a,(a,(a,(…)))) GetHead(D)=a GetTail(D)=(D) Length(D)=2
二维数组Amn按“行优先顺序”存储在内存中,假 设每个元素占d个存储单元,则aij的地址计算函数为: LOC(aij)=LOC(a11)+[(i-1)×n+j-1]×d 对应C语言的二维数组:DataType A[m][n]; 数组A[m][n]的两个下标的下界均为0,上界分别为m-1、 n-1,每个数据元素占k个存储单元,二维数组中任一元 素a[i,j]的存储位置可由下列公式确定。 loc[i,j]=loc[0,0]+(i* n + j ) * k 其中,loc[0,0]是A[0][0]的存储位置,loc[i,j]是A[i][j]的存 储位置。这个式子确定了C语言的二维数组元素的位置 和下标的关系。 例:int a[3][5]; &a[2][3]=
举例: 1. 给定整型数组b[3][5],b[0][0]的存储地址为1200,试求在 行序为主的存储方式下: (1)b[2][4]的存储地址; (2)该数组占用的字节数。 2. 二维数组A[-1..2,3..6]共含有多少个元素? 三维数组R[c1..d1,c2..d2,c3..d3]共含有多少个元素? 3. 数组中B[1..10,-2..6,2..8]以行优先顺序存储,设第一个元 素的首地址是100,每个元素点3个存储长度的存储空间, 则元素B[5,0,7]的存储地址是多少?
还需设置两个指针型数组,一个用来存放行链表的 表头指针,另一个用来存放列链表的表头指针,这样对 矩阵非零元素的访问,既可在行链表上访问,又可在列 链表上访问。
只有当矩阵非零元素少于总元素个数的20%时,采用 十字链表才有可能节省存储空间。
5.3
广义表的概念
1. 广义表的定义 广义表(Lists)又称列表,是线性表的推广。广义 表是n(n≥0)个元素的有限序列,通常记作 LS=(a1,a2,…an) 其中LS是广义表的名字,n为它的长度,ai是原子 或者是一个广义表。若ai是广义表,则称它为LS的子表。 为了区分原子和广义表,书写时用大写字母表示广 义表,用小写字母表示原子。 若广义表LS非空(n≥1),则a1是LS的表头,其余 元素组成的表(a2,a3,…an)称为LS的表尾。 广义表是递归定义的,广义表中可以包含广义表。 一个表的“深度(Depth)”是指表展开后所含括 号的层数。
图5-6
稀疏矩阵的三元组表
三元组表类型描述: #define MaxSize 10000 typedef int DataType; typedef struct { int i,j; //非零元素的行、列号 DataType v; //非零元素的值 }TriTupleNode; typedef struct { TriTupleNode data[MaxSize]; int m,n,t; //矩阵的行数、列数及非零元素个数 }TriTupleTable;
矩阵转置运算的算法5-2: void TransMatrix(TriTupleTable *b,TriTupleTable *a) { int p,q,col; b->m=a->n; b->n=a->m; b->t=a->t; if(b->t<=0) { printf("A无非零元素\n"); exit(0); } q=0; for(col=0;col<a->n;col++) for(p=0;p<a->t;p++) if(a->data[p].j==col) { b->data[q].v=a->data[p].v; b->data[q].i=a->data[p]=j; b->data[q].j=a->data[p]=i; q++; } }
2. 三角矩阵 以主对角线划分,三角矩阵有上三角和下三角两种。 上三角矩阵的下三角(不包括主角线)中的元素均为 常数c。下三角矩阵正好相反,它的主对角线上方均 为常数c。在多数情况下,三角矩阵的常数c为零。
上三角矩阵
下三角矩阵
上三角矩阵中,sa[k]和aij的对应关系是:
下三角矩阵中,sa[k]和aij的对应关系是:
5.2
矩阵的压缩存储
对于矩阵,关心的是如何存储它的元素,使矩阵的 各种运算能有效地进行。 对于阶数很高的矩阵,同时在矩阵中有许多值相同 的元素或者零元素,为了节省存储,可对这类矩阵进行 压缩存储。 压缩存储:即为多个相同的非零元素只分配一个存 储空间,对零元素不分配空间。
5.2.1 特殊矩阵 所谓特殊矩阵(Special Matrices)是指非零元素 或零元素的分布有一定规律的矩阵。 1.对称矩阵 在一个n阶方阵A中,若元素满足下述性质: aij=aji 0≤i,j≤n-1 则称A为对称矩阵。如图所示:
数组虽然是线性表的特例,但关于数组的运算与一般 线性表的运算不同,数组的主要运算有两种:
(1)给定一组下标,存取相应的数据元素;
(2)给定一组下标,修改相应的数据元素。
2. 数组的顺序存储结构 数组的顺序存储结构指的是用一组连续的存储单 元依次存放数组元素。 (1) 行优先顺序 行优先顺序:将数组元素按行向量排列,行优先 顺序规定为先排最右的下标,从右向左,最后排最左下 标。 例:写出A[3][4]、A[2][3][4]元素按行优先顺序。 (2) 列优先顺序 列优先顺序:将数组元素按列向量排列,列优 先顺序规定为先排最左下标,从左向右,最后 排最右 下标。
怎样存储该矩阵的元素?
存储元素为:{1,5,0,1,8,9,3,0,2,5,7,0,6,1,3},共15个。 将这些元素存放在一个向量sa[0…n(n+1)/2-1]中。 怎样通过元素下标在sa中找到该元素的值? aij和sa[k]的对应关系: 若i>=j,则aij在下三角矩阵中,之前的i行(第0行到第i1行)共有1+2+..+i=i*(i+1)/2个元素,在第i行上, aij前有j 个元素,因此: k=i*(i+1)/2+j (0<=k<n*(n+1)/2) 若i<j,则aij在上三角矩阵中, aij=aji则: k=j*(j+1)/2+i (0<=k<n*(n+1)/2)
相关文档
最新文档