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

合集下载

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

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

数据结构-第五章 数组与广义表-文档资料

数据结构-第五章 数组与广义表-文档资料

上 三 角 矩 阵 下 三 角 矩 阵
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。
三对角矩阵的压缩存储

数据结构第5章数组和广义表数组ppt课件

数据结构第5章数组和广义表数组ppt课件

if (!A.base) return ERROR;
数组基址指针
free(A.base); A.base = NULL; if !(A.bounds) return ERROR;
free(A.bounds); A.bounds=NULL;
各维长度保 存区指针 映保像存函区数指针ci
if !(A.constants) return ERROR; free(A.constants); A.constants=NULL; }

………………….
a2n

am1 am2 …….. amn
am1
am2

amn
§5.2 数组的顺序表示和实现
❖按列优先顺序存放
a11 a21

a11 a12 …….. a1n
am1 a12
a21 a22 …….. a2n
a22

………………….
am2
am1 am2 …….. amn
… a1n
a2n
一个n维数组可以看成是由若干个n-1维数组组成 的线性表。
§5.1 数组的定义
❖数组的抽象数据类型定义
ADT Array { 数据对象:D={aj1j2…jn | ji=0,…,bi-1, i=1,2,…,n,n(>0)称为数组
的维数,bi是数组第i维的长度,ji是数组元素的第i维下标, aj1…jn∈ElemSet } 数据关系:R={R1, R2,…, Rn} Ri={ < aj1…ji…jn , aj1…ji+1…jn > | 0≤jk≤bk-1, 1≤k≤n 且k≠i, 0≤ji≤bi-2, aj1…ji…jn , aj1…ji+1…jn∈D, i=1,2,…,n 基本操作:

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

数据结构第五章数组和广义表
typedef elemtype Array2[m][n]; 等价于
typedef elemtype Array1[n]; typedef Array1 Array2[m]; 同理,可以用 n-1 维数组的数据类型来定义 n 维数组。
8
第8页
5.2 数组的顺序存贮结构
一、数组的顺序表示和实现
(1) 类型特点 ① 只有引用型操作,一般不作插入或删除操作; ② 数组是多维的结构,而存储空间是一个一维的结构。
第 17 页
(2) 压缩存储的有关概念 ① 压缩存储:为多个值相同的元素分配一个存储空间,对零 元不分配空间。 ② 特殊矩阵:值相同的元素或零元素在矩阵中的分布有一定 规律。 ③ 稀疏矩阵:值相同的元素或者零元素在矩阵中的分布无规 律。
第 18 页
(3) 特殊矩阵
① 概念:若n阶矩阵 A 中的元满足:aij=aji 1≤i,j≤n,则 称为n 阶对称矩阵。
第1页
第五章 数组和广义表
5. 1 数组的定义 5.2 数组的顺序存储结构 5. 3 矩阵的压缩存储 5. 4 广义表的定义 5.5 广义表的存储结构
第2页
第五章 数组和广义表
前4章介绍的数据结构共同特点: ▲ 都属于线性数据结构; ▲ 每种数据结构中的数据元素,都作为原子数据, 不再进行分解; 本章讨论的两种数据结构:数组和广义表,其共 同特点是: ▲ 从逻辑结构上看它们,可看成是线性结构的一 种扩展; ▲ 数据元素本身也是一个数据结构;
4
第4页
(2) 二维数组的解释
二维数组中的每个元素都受两个 线性关系的约束,即行关系和列关系, 在每个关系中,每个元素aij都有且仅 有一个直接前趋,都有且仅有一个直 接后继。
aa … 00 01

《数据结构——用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.3.1 特殊矩阵
是指非零元素或零元素的分布有一定规律的矩阵。
1、对称矩阵 在一个n阶方阵A中,若元素满足下述性质: aij = aji 0≦i,j≦n-1 则称A为对称矩阵。
对称矩阵中的元素关于主对角线对称,故只 要存储矩阵中上三角或下三角中的元素,这样, 能节约近一半的存储空间。

2013-7-25 第4章 18
5.3 矩阵的压缩存储

在科学与工程计算问题中,矩阵是一种常用 的数学对象,在高级语言编制程序时,常将 一个矩阵描述为一个二维数组。 当矩阵中的非零元素呈某种规律分布或者矩 阵中出现大量的零元素的情况下,会占用许 多单元去存储重复的非零元素或零元素,这 对高阶矩阵会造成极大的浪费。 为了节省存储空间,我们可以对这类矩阵进 行压缩存储:
5.2 数组的顺序表示和实现 由于计算机的内存结构是一维的, 因此用一维内存来表示多维数组,就必 须按某种次序将数组元素排成一列序列 ,然后将这个线性序列存放在存储器中 。 又由于对数组一般不做插入和删除 操作,也就是说,数组一旦建立,结构 中的元素个数和元素间的关系就不再发 生变化。因此,一般都是采用顺序存储 的方法来表示数组。
即为多个相同的非零元素只分配一个存储空间; 对零元素不分配空间。


课堂讨论: 1. 什么是压缩存储? 若多个数据元素的值都相同,则只分配一个元素值的 存储空间,且零元素不占存储空间。 2. 所有二维数组(矩阵)都能压缩吗? 未必,要看矩阵是否具备以上压缩条件。 3. 什么样的矩阵具备以上压缩条件? 一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵, 稀疏矩阵等。 4. 什么叫稀疏矩阵? 矩阵中非零元素的个数较少(一般小于5%)
通常有两种顺序存储方式:
⑴行优先顺序——将数组元素按行排列,第i+1个行 向量紧接在第i个行向量后面。以二维数组为例,按 行优先顺序存储的线性序列为: a11,a12,…,a1n,a21,a22,…a2n,……,am1,am2,…,amn 在PASCAL、C语言中,数组就是按行优先顺序存 储的。 ⑵列优先顺序——将数组元素按列向量排列,第j+1 个列向量紧接在第j个列向量之后,A的m*n个元素按 列优先顺序存储的线性序列为: a11,a21,…,am1,a12,a22,…am2,……,an1,an2,…,anm 在FORTRAN语言中,数组就是按列优先顺序存储的。

数据结构课件PPT数组和广义表

数据结构课件PPT数组和广义表
T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; if (T.tu)
{ q=1; for (col=1;col<=T.mu;++col) for(p=1;p<=M.tu;++p) if ( M.data[p].j==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; ++q; } }
(row) (col) (value)
[0] 1 4 22
[0] 1 5 91
[1] 1 7 15
[1] 2 2 11
[2] 2 2 11
[2] 3 6 28
[3] 2 [4] 3来自6 17 4 -6[3] 4 [4] 4
1 22 3 -6
[5] 4 6 39
[5] 6 2 17
[6] 5 1 91
[6] 6 4 39
cpot[1]=1 cpot[col]=cpot[col-1]+num[col-1]
稀疏矩阵的快速转置(算法5.2)
Status FastTransposeSMatrix(TSMatrix M,TSMatrix &T) { T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
if (T.tu) { for (col=1;col<=M.nu;++col) num[col]=0; for (t=1;t<=M.tu;++t) ++num[M.data[t].j]; cpot[1]=1; for ( col=2;col<=M.nu;++col) cpot[col]=cpot[col-1]+num[col-1]; for (p=1;p<=M.Tu;++p) { col=M.data[p].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]; } }

大学数据结构课件--第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章字符串、数组和广义表

5.1.2 串的操作
下面讨论串的操作,为了方便讨论,我们先定义如下几个串:
s1 = "It is a car"
s2 = "jeep" s3 = "car" 串的操作主要有: (1) 求串的长度。例如,s1的长度为11,s2的长度为4。
(2) 把一个串的值赋值给另一个串。若有s4=s3,则s4 的值为 "car"。
String operator + (String & ob);
(3) 把两个串连接形成一个长度为两个串长度之和的新 串。设s5为s2和s3连接形成的新串,则s5="jeepcar",即将 后面的串连接在前面串的尾部。
(4) 比较两个串的ASCII码值的大小。设str1和str2为两个串, 按下述规则得到两个串的比较结果。 若str1小于str2,比较结果为-1; 若str1等于str2,比较结果为0;
(8) 在一个串中插入另一个串。设把串str2插入到串str1 中,pos为要插入的起始位臵,则操作结果形成的新串长 度为str1和str2之和。
例如,把串s7=" not",插入到串s1的位臵5处,则操作结 果形成的新串s8="It is not a car"。 (9) 从一个串中删除一个子串。设在串str中要删除长度 为length的子串,pos为要删除的子串在str中的起始位臵, 则删除后的新串长度为原长度减去length。 例如,要在s8中删除长度为4的子串,起始位臵为5,则 删除后的新串为s1。 (10) 从键盘输入一个字符序列。 (11) 在屏幕上显示一个字符序列。
C++的流库(iostream.h)为字符输入流cin(键盘)和字符 输出流cout(屏幕)提供I/O操作,使用方法如下: (1) 读串 Stream Variable >>str cin>>s4; //若输入"Hello!",则s4 = "Hello!" (2) 写串 Stream Variable <<str cout << s4; //输出"Hello!" C++的串库提供的实现字符串操作的函数功能较强,但由于 函数定位通常用字符指针,所以使用的难度较大。

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

数据结构第5章数组与广义表
0 0 3 0 1 0 1 2 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 2 0
一个稀疏矩阵里存在大量的零元素,若 以常规方法,即以二维数组来存储稀疏矩 阵时产生如下问题: 1) 零值元素占了很多空间; 2) 如果进行计算,则会进行很多和零值 的运算,如是除法,还需判别除数是否为 零。
2 三角矩阵 以主对角线划分,三角矩阵有上三角 和下三角两种。如图所示。其中(a)图为下 三角矩阵:主对角线以上均为同一个常 数;(b)图为上三角矩阵,主对角线以下均 为同一个常数。
(1) 下三角矩阵 三角矩阵中的重复元素c可共享一个 存储空间,其余的元素正好有n(n+1)/2 个,因此,三角矩阵可压缩存储到向量 SA[0…n(n+1)/2]中,其中c存放在向量的 最后1个分量SA[n(n+1)/2]中。 该存储方式可节约n*(n-1)/2-1个存储 单元。
传统矩阵的转置算法为: for(col=1; col<=n ;++col) for(row=0 ; row<=m ;++row) b[col][row]=a[row][col] ;
时间复杂度为O(n×m) 当非零元素的个数tn和m×n同数量级时,算法 TransMatrix的时间复杂度为O(m×n2)。
以“行优先顺序”存储: (1) 第1行中的每个元素对应的(首)地址是: LOC[a1j]=LOC[a11]+(j-1) ×L (2) 第2行中的每个元素对应的(首)地址是: LOC[a2j]=LOC[a11]+n×L +(j-1) ×L (3) 第m行中的每个元素对应的(首)地址是: LOC[amj]=LOC[a11]+(m-1) n×L +(j-1) ×L

数据结构数组和广义表

数据结构数组和广义表

数据结构05数组与广义表数组与广义表可以看做是线性表地扩展,即数组与广义表地数据元素本身也是一种数据结构。

5.1 数组地基本概念5.2 数组地存储结构5.3 矩阵地压缩存储5.4 广义表地基本概念数组是由相同类型地一组数据元素组成地一个有限序列。

其数据元素通常也称为数组元素。

数组地每个数据元素都有一个序号,称为下标。

可以通过数组下标访问数据元素。

数据元素受n(n≥1)个线性关系地约束,每个数据元素在n个线性关系地序号 i1,i2,…,in称为该数据元素地下标,并称该数组为n维数组。

如下图是一个m行,n列地二维数组A矩阵任何一个元素都有两个下标,一个为行号,另一个为列号。

如aij表示第i行j列地数据元素。

数组也是一种线性数据结构,它可以看成是线性表地一种扩充。

一维数组可以看作是一个线性表,二维数组可以看作数据元素是一维数组(或线性表)地线性表,其一行或一列就是一个一维数组地数据元素。

如上例地二维数组既可表示成一个行向量地线性表: A1=(a11,a12,···,a1n)A2=(a21,a22, ···,a2n)A=(A1,A2, ···,Am) ············Am=(am1,am2, ···,amn)也可表示成一个列向量地线性表:B1=(a11,a21,···,am1)B2=(a12,a22, ···,am2)A=(B1,B2, ···,Bm) ············Bn=(a1n,a2n, ···,amn)数组地每个数据元素都与一组唯一地下标值对应。

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

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

5.3.1
特殊矩阵
1、对称矩阵 在一个n阶方阵A中,若元素满足下述性质: aij = aji 1≤i,j≤n 则称A为对称矩阵。 a11 1 5 1 3 7 a21 a 22 5 0 8 0 0 a31 a32 a33 1 8 9 2 6 ……………….. 3 0 2 5 1 an 1 a n 2 a n 3 …a n n 7 0 6 1 3
第5章
数组和广义表
5.1 数组的定义
5.2 数组的顺序表示和实现
5.3 矩阵的压缩存储
5.3.1 特殊矩阵
5.3.2 稀疏矩阵
5.4 广义表的定义
5.1 数组的定义
数组-----线性表的扩展 A =(a0,a1,a2,…,an-1)
a00 a10 ┇ Am×n= ai0 ┇ am-1,0 a01 … a0j … a11 … a1j … ┇ ai2 … aij … ┇ am-1,2 … am-1,j … a0,n-1 a1,n-1 ai,n-1 am-1,n-1 α0 α1 ┇ Am×n= α i ┇ α m-1
Assign( &A, e, index1, ..., indexn) 赋值操作 初始条件:A是n维数组,e为元素变量,随后是n个下标值。 操作结果:若下标不超界,则将e的值赋给所指定的A的元 素,并返回OK。 对于数组来说一旦维数确定了,每个元素的下标确定了, 那么整个数组就确定了,这样的一个数组结构除了能改变 某元素的值,其他的不能再改变。
5.2 数组的顺序表示和实现
数组类型特点: 1) 只有引用型操作,没有加工型操作; 2) 数组是多维的结构,而存储空间是一个一维的结构。 有两种顺序映象的方式。
有两种顺序映像方法: 1)以行序为主序(行优先,先行后列):先存储行号较小 的元素,行号相同者先存储列号较小的元素;

数据结构讲义第5章-数组和广义表

数据结构讲义第5章-数组和广义表
对于一个矩阵结构,显然用一个二维数组来表示是非常 恰当的.但有时会遇到这样一类矩阵:在这种矩阵中有 许多值相同的元素或者是零元素,为了节省存储空间, 可以对这类矩阵进行压缩存储. 压缩存储是:为多个值相同的元素只分配一个存储空间: 对零元素不分配存储空间. 特殊矩阵:值相同的元素或者零元素在矩阵中的分布有 一定规律,则称此类矩阵为特殊矩阵,反之,称为稀疏 矩阵.
5.4 广义表
5)若广义表不空,则可分成表头和表尾,反之,一对表头和表尾 可唯一确定广义表 对非空广义表:称第一个元素为L的表头,其余元素组成的表称 为LS的表尾; B = (a,(b,c,d)) 表头:a 表尾 ((b,c,d)) 即 HEAD(B)=a, C = (e) D = (A,B,C,f ) 表头:e 表尾 ( ) TAIL(B)=((b,c,d)),
5.4 广义表
4)下面是一些广义表的例子; A = ( ) 空表,表长为0; B = (a,(b,c,d)) B的表长为2,两个元素分别为 a 和子表(b,c,d); C = (e) C中只有一个元素e,表长为1; D = (A,B,C,f ) D 的表长为4,它的前三个元素 A B C 广义表, 4 A,B,C , 第四个是单元素; E=( a ,E ) 递归表.
以二维数组为例:二维数组中的每个元素都受两个线性关 系的约束即行关系和列关系,在每个关系中,每个元素aij 都有且仅有一个直接前趋,都有且仅有一个直接后继. 在行关系中 aij直接前趋是 aij直接后继是 在列关系中 aij直接前趋是 aij直接后继是
a00 a01 a10 a11
a0 n-1 a1 n-1
a11 a21 ┇ a12 a22 ┇ ai2 ┇ … amj … amn … aij … ain … … a1j a2j … … a1n a2n β1 β2 ┇ βi ┇ βm

数据结构复习数组和广义表

数据结构复习数组和广义表
将一个a100100的三对角矩阵以行主序存入一维数组b298中元素a6564在b数组中的位置k等3稀疏矩阵的存储方式三元组法矩阵a中有非零元个数s远远小于矩阵元素的总数则称a为稀疏矩阵
数据结构复习 (数组和广义表)
第5章 数组和广义表
一、数组 1、数组的顺序存储方式和地址计算方法 数组的存储方式有:
(1)对称矩阵和上(或下)三角矩阵的压缩存储。 例:下三角矩阵的存储,按行主序方式。 k=i(i+1)/2+j 当i>=j时 k= 0 当i<j时 a[i][j] 在一维数组s[k] 中(i>=j)或为0(i<j)。 (2)对角矩阵 例:以三对角矩阵为例,按行主序方式存储, 仅存储非零部分。 将一个a[100][100]的三对角矩阵以行主序存入一 维数组B[298]中,元素a[65][64]在B数组中的位置k等 于 。
3、稀疏矩阵的存储方式 ——三元组法 矩阵A中有非零元个数s远远小于矩阵元素的 i j v 总数,则称A为稀疏矩阵。
1 2 3 1 6 3 12 9 -3 14 24
M=
0 12 9 0 0 0 0 0 0 000 -3 0 0 0 0 14 0 0 24 1、广义表的定义
广义表 ls=(d1,d2,……,dn)。其中每个元素可以是原子, 也可以是子表。 称d1为表头,d2,……,dn为表尾。 n: 表示广义表的长度,括号层数表示广义表的深度。
2、广义表与线性表的区别
线性表(a1,a2,……,an)中每个元素都具有相同的类型, 有两种存储结构:顺序表和链表。 广义表(d1,d2,……,dn)中每个元素可以是原子,也可以 是子表。可以将广义表看作是线性表的推广。由于原子和子 表的类型不同,所以只能用链式存储结构。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第五章 递归和广义表
32
假设有一个6×7阶稀疏矩阵A(为图示方便,我 们所取的行列数都很小),A中元素如下图所示。则 对应的三元组线性表为:
((0,2,1),(1,1,2),(2,0,3),(3,3,5), (4,4,6),(5,5,7),(5,6,4))
0 0 1 0 0 0 0
0 2 0 0 0 0 0
第五章 递归和广义表
26
5.2 稀疏矩阵
第五章 递归和广义表
27
➢ 稀疏矩阵:矩阵中的零元素非常多的矩 阵称作稀疏矩阵。对于一个m×n的矩阵, 设s为矩阵元素的个数,有s=m*n,设t为 矩阵中非零元素的总和,满足t<<s的矩 阵。
➢ 稠密矩阵:一个不稀疏的矩阵称作稠密 矩阵。
第五章 递归和广义表
0700600
= 0305000 0008000
0 0 9 0 0 0 7 4×7
第五章 递归和广义表
34
(ije)
(ije)
(ije)
p1 ( 0 4 2 ) p2 ( 0 1 7 )
p( 0 1 7 )
+ = ( 1 1 3 )
(234)
(044) (135)
(046) (113)
(365)
(234)
234 h3
h4
第五章 递归和广义表
46
5.3 广义表的定义
第五章 递归和广义表
47
➢ 广义表:n个元素的一个序列,若n=0时 则称为空表。设ai为广义表的第i个元素, 则广义表GL的一般表示为:
GL=(a1,a2,…,ai,…,an) ➢ N为广义表的长度,n≥0。
➢ 第0行和第n-1行 2个非零元素
➢ 其余各行
3个非零元素
➢ 若把非零元素存放在数组SA中
第五章 递归和广义表
21
➢ 对于不在第0行的非零元素aij: 1. 本行第1个元素:k=2+3(i-1)=3i-1
而j=i-1,则k=2i+(i-1)=2i+j;
2. 本行第2个元素:k=2+3(i-1)+1=3i 而j=i,则k=2i+i=2i+j;
k=
2
j( j 1) i i< j
2
第五章 递归和广义表
13
➢ n阶下三角矩阵:行列均为n的矩阵中, 上三角(不包括对角线)中的数据元素 均为常数c或0。
第五章 递归和广义表
14
a00 0 ...... 0
A=
a10 a11 ...... 0
an-1,0...... an-1,n-1
i(i 1) j 当i≥j时
k=
2
n(n 1) 当i< j时
2
第五章 递归和广义表
15
➢ n阶上三角矩阵:行列均为n的矩阵中, 下三角(不包括对角线)中的数据元素 均为常数c或0。
第五章 递归和广义表
16
a00 a01...... a0,n-1
A=
0 a11...... a1,n-1
0 ...... an-1,n-1
i(2n i 1) j i 当i≥j时
第五章 递归和广义表
25
按列优先的存储次序: A[0][0][0][0], A[1][0][0][0], A[0][1][0][0], A[1][1][0][0], A[0][0][1][0], A[1][0][1][0], A[0][1][1][0], A[1][1][1][0], A[0][0][0][1], A[1][0][0][1], A[0][1][0][1], A[1][1][0][1], A[0][0][1][1], A[1][0][1][1], A[0][1][1][1], A[1][1][1][1]
7 ×4
第五章 递归和广义表
36
转置算法思想: (1) m , n 互换;(2) i , j 互换; (3) 重排三元组顺序;
(ije)
(ije)
(001) (042) (113) (234) (355) (366) m n num 47 6
(001) (113) (324) (402) (535) (636) m n num 74 6
第五章 递归和广义表
8
5.1.3 特殊矩阵的压缩存储
➢ 特殊矩阵是指非零元素或零元素的分布 有一定规律的矩阵,为了节省存储空间,特 别是在高阶矩阵的情况下,可以利用特殊 矩阵的规律,对它们进行压缩存储,也就是 说,使多个相同的非零元素共享同一个存 储单元,对零元素不分配存储空间。
➢ 特殊矩阵的主要形式有对称矩阵、对角 矩阵等,它们都是方阵,即行数和列数相同。
第五章 递归和广义表
11
SA a00a10 a11...... an-1,0 an-1,1 ...... an-1,n-1
第五章 递归和广义表
12
a00 a01...... a0,n-1
A=
a10 a11...... a1,n-1
an-1,0...... an-1,n-1
i(i 1) j i>=j
0
半带宽为b的对角矩阵
第五章 递归和广义表
19
三对角矩阵
a00 a01
0
0
a10
a11
a12
A= 0
0
a a a (n 2)(n 3) (n 2)(n 2) (n 2)(n 1)
0
0
a a (n 1)(n 2) (n 1)(n 1)
第五章 递归和广义表
20
41
0000a00
0
0b00000
1
000c000
2
0 0 0 0 0 0 d 4×7 3
Hale Waihona Puke 4a^ 1b^ 3c^ 6 d^
第五章 递归和广义表
42
稀疏矩阵的十字链表存储结构
➢ 为稀疏矩阵的每一行设置一个单独链表, 同时也为每一列设置一个单独链表。
第五章 递归和广义表
43
i j num down right
第五章 递归和广义表
37
5.2.2 稀疏矩阵的三元组链表
➢ 头结点的行号域存储了稀疏矩阵的行数, 列号域存储了稀疏矩阵的列数。
➢ 用链指针依次把稀疏矩阵中非零元的三 元组链接起来就构成了最简单的三元组 链表。
第五章 递归和广义表
38
m n num head
……
第五章 递归和广义表
39
0000a00 0b00000 000c000 0 0 0 0 0 0 d 4×7
5.1 数组
第五章 递归和广义表
1
5.1.1 数组的定义
➢ 数组(Array) :是n(n>1)个相同数据类型的 数据元素a1,a2,a3,…,an构成的占用一块地址连 续的内存单元的有限序列。
第五章 递归和广义表
2
5.1.2 数组的存储结构
➢ 对一个有n个数据元素的一维数组,设a0 是下标为0的数组元素,Loc(a0)是a0的存 储地址,k是每个数据元素所需的存储单 元,则数组中任一数据元素ai的存储地址 Loc(ai)可由下边公式求出:
3 0 0 0 0 0 0 A67 0 0 0 5 0 0 0
0 0 0 0 6 0 0
0 0 0 0 0 7 4
第五章 递归和广义表
一个稀疏矩阵A
33
稀疏矩阵相加
0000200
+ 0 3 0 0 0 0 0
0004000 0 0 0 0 0 0 5 4×7
0700400 0005000 0004000 0 0 9 0 0 0 2 4×7
28
三元组顺序表
稀疏矩阵的压缩 存储结构
三元组链表
一般链表 行指针数组的链表
行列指针的十字链表
第五章 递归和广义表
29
➢ 三元组顺序表:用顺序表存储的三元组表。
➢ 三元组链表:用链表存储的三元组表。 行号 列号 元素值
第五章 递归和广义表
30
5.2.1 稀疏矩阵的三元组顺序存储 结构
➢ 行数
:m
➢ 列数
:n
➢ 非零个数 : num
➢ 三元组空间: 三元组1 三元组2 ……
第五章 递归和广义表
31
例如:
0000a00 0b00000 000c000 0 0 0 0 0 0 d 4×7
按行存储三元组
row:4 col: 7 num:4 (0,4,a) (1,1,b) (2,3,c) (3,6,d)
第五章 递归和广义表
4
➢ 设a1,1是第1行第1列的数组元素,Loc(a1,1) 是a1,1的存储地址,k是每个数据元素所 需的存储单元,则数组中任一数据元素 aij的存储地址Loc(aij)可由下边公式求出:
Loc(ai,j)=Loc(a1,1)+((i-1)*n+(j-1))*k
(0 <i ≤ m,0 <j ≤ n)
第五章 递归和广义表
22
3. 本行第3个元素:k=2+3(i-1)+2=3i+1 而j=i+1,则k=2i+(i+1)=2i+j;
总之:k=2i+j
第五章 递归和广义表
23
例5.2 按行优先顺序和按列优先顺序列出 四维数组A[2][2][2][2]所有元素在内存中的 存储次序。
第五章 递归和广义表
第五章 递归和广义表
9
对称矩阵的压缩存储
➢ n阶对称矩阵若一个n阶矩阵A中的数据 元素满足aij=aji (0≤i,j ≤n-1) 。
a00 a01...... a0,n-1
A=
a10 a11...... a1,n-1
相关文档
最新文档