(数组和广义表)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
则称矩阵A为n 阶对称矩阵。
A[1:n, 1:n] =
a11 a12 a13 … … a1n a21 a22 a23 … … a2n a31 a32 a33 … … a3n …… …… an1 an2 an3 … … ann
传统做法: 定义一个二维数组 A[n][n ]
A[n][n] =
North China Electric Power University
★稀疏矩阵的压缩存储
North China Electric Power University
1)稀疏矩阵的定义
一个较大的矩阵中,零元素的个数相对于整 个矩阵元素的总个数所占比例较大时,可以称该 矩阵为一个稀疏矩阵。
A=
15 0 0 22 0 -15 0 11 3 0 0 0 0 0 0 -6 0 0 00 000 0 91 0 0 0 0 0 0 0 28 0 0 0
间,而对0元素一般情况下不分配存储空间。
A=
a11 a12 a13 … … a1n a21 a22 a23 … … a2n …… …… am1 am2 am3 … … amn
A[m][n]
传统做法
North China Electric Power University
1)对称矩阵的压缩存储
一个n 阶矩阵A的元素满足性质 aij = aji 1≤i, j≤n
pot[1]=1 pot[j]=pot[j-1]+num[j-1] (2≤j≤n)
15 0 0 22 0 11 3 0 0 0 0 -6
M= 0 0 0 0
91 0 0 0 0 0 28 0
0 -15 00 00 00 00 00
North China Electric Power University
数据结构
Data Structure
华北电力大学计算机系
(Dept. of Computer , North China Electric Power University)
North China Electric Power University
North China Electric Power University
15 0 0 0 91 0
0 11 0 0 0 0
N=
0 3 0 0 0 28 22 0 -6 0 0 0
000000
-15 0 0 0 0 0
1] 2] 3]
B[0, 6 6 8
B[1, 1 1 15
B[2, 1 5 91
B=
第四章 数组和广义 表 ★ 数组的逻辑结构
★ 数组的顺序存储分配 ★ 矩阵的压缩存储 ★ 稀疏矩阵 ★ 广义表
★数组的逻辑结构
North China Electric Power University
一个二维数组的类型定义如下:
ElemType A[m][n];
数组可表示为:
它可以看成是由m个行向量或 n个列向量组成的线性表。也即, 二维数组可以看成是一种推广的 线性表,这种线性表的每一个数 据元素本身也是一个线性表。
void transmat(A,B);
if (A[p][2]==col )
{
{ B[q][1]=A[p][2];
(m,n,t)=(A[0][1],A[0][2],A[0][3]); B[q][2]=A[p][1];
B[0][1],B[0][2],B[0][3])=(n,m,t); B[q][3]=A[p][3];
{ k=
i(i-1)/2+j
j(j-1)/2+i
当i≥j时 当i < j时
North China Electric Power University
2)对角矩阵的压缩存储
若一个矩阵中,值非0的元素对称地集中在主对 角线两旁的一个带状区域中(该区域之外的元素都为 0元素),称这样的矩阵为对角矩阵。
0元素
Loc(aij) = Loc(a11) + (j1)mk + (i1)k
= Loc(a11) + [ (j1)m+(i1) ]k
★特殊矩阵的压缩存储
North China Electric Power University
所谓压缩存储是指为多个值相同的元素, 或者 位置分布有规律的那些元素分配尽可能少的存储空
例如 :
(1,1,15)表示第1行、第1列、值为15的元素。 (1,4,22)表示第1行、第4列、值为22的元素。 (1,6,-15)表示第1行、第6列、值为-15的元素。
( m, n, t )
其中,m, n, t 分别表示稀疏矩阵的总的行数、
总的列数与非零元素的总个数。
North China Electric Power University
a11 a12 a13 … … a1n a21 a22 a23 … … a2n a31 a32 a33 … … a3n …… …… an1 an2 an3 … … ann
V a11 a21 a22 ... ... aij ... ... ann
k=1
2
3
... ...
n*(n+1)/2
A中任意一元素aij与V[k] 之间存在对应关系:
2. 二维数组A[m][n]
A[m][n] =
a11 a12 a13 … … a1n a21 a22 a23 … … a2n
…… …… am1 am2 am3 … … amn
行序为主序分配方式 列序为主序分配方式
North China Electric Power University
1)行序为主序分配方式
North China Electric Power University
2)列序为主序分配方式
A[m][n]=
a11 a12 a13 … … a1n a21 a22 a23 … … a2n
…… …… am1 am2 am3 … … amn
a11 . . . am1 a12 . . . am2 a13 . . . aij . . . amn
if (t!=0)
q=q+1;
{ q=1;
}
for(col=1; col<=n; col++) }
for(p=1;p<=t; p++)
算法的评价
North China Electric Power University
1.空间开销:3*(t+1),当t<1/3*(m*n)时,所需存储量比按矩 形结构存储的二维数组要少。
……
第1列
第2列
North China Electric Power University
A[m][n] =
ຫໍສະໝຸດ Baidu
a11 a12 a13 … … a1n a21 a22 a23 … … a2n a31 a32 a33 … … a3n
……
……
aij
……
am1 am2 am3 … … amn
j-1 列
若已知每个元素占k个存储单元,并且知道第一 个元素的存储地址 LOC(a11), 则
B[3, B[4,
2 3
2 11 23
B[5, 3 6 28
B[6, 4 1 22
B[7, 4 3 -6
B[8, 6 4 -15
表示稀疏矩阵M的三列的二维数组
North China Electric Power University
(1)转置过程按照B数组中元素的最终排列顺序进行
由于矩阵M的列经过转置后变为N的行,所以可以按照M的 列序来转置.为了按顺序找到M中的每一列的所有非0元素,对 数组A从第一行起将每行的第二列扫描n遍,每遍扫描分别找到 矩阵N的从第一行到第n行的各行所有非0元素,并产生B数组相 应的行。
B[n][n] =
b11 b12 b21 b22 b23
b32 b33 b34
0元素
0元素
bn-1n bnn-1 bn n
b11 b12 b21
k=1
2
3
b22 ... ... bij ... ... bnn
4
... ...
3n-2
B中任一非零元素 bij 与V[k] 之间存在对应关系:
k = 2 i + j – 2 i=[k/3]+1 j=k-2(i-1)
North China Electric Power University
(2)B数组中元素的生成不是顺序的而是跳跃式的
即转换按数组A中行的顺序进行,但转换后的元素在B中 不是连续存放,而是将它放入它在B中最终应占据的位置。
Num[n]:存放矩阵N中各行非0元素的个数; Pot[n]:存放矩阵N中各行第一个非0元素在数组B中应占的位置.
2.时间开销:O(n*t)。常规矩阵的转置运算需要的时间为O(n*m), 若非0元素的个数t与m*n有相同的数量级时,算法tranmat的运 算量就达到了O(m*n2)了,这时,虽然节省了一些存储空间,却 浪费了大量的计算时间。
算法的改进之处:对A数组的扫描存在着浪费现象,即n次扫描 中每次都要检查t个元素,实际并不需要。因为:每次需要扫描 的A的元素在减少,凡在某遍扫描中已转置到B中去的A的元素 以后就不需要再扫描了。
0 0 28 0
0 -15 00 00 00 00 00
1] 2] 3]
A[0, 6 6 8
A[1, 1 1 15
A[2, 1 4 22
A=
A[3, 1 A[4, 2
6 -15 2 11
A[5, 2 3 3
A[6, 3 4 -6
A[7, 5 1 91
A[8, 6 3 28
表示稀疏矩阵M的三列的二维数组
1. 一维数组A[n]
A[n] = ( a1, a2, a3, … , an )
a1 a2 a3

an-1 an
若已知每个元素占k 个存储单元,并且知道第 一个元素的存储地址Loc(a1), 则
Loc(ai) = Loc(a1) + (i-1) k
North China Electric Power University
a11 a12 … a1n
A= a21 a22 … a2n
… … ……
am1 am2 … amn
类似地, 一个三维数组可以看成是数据元素为二维数组的线性表 一个n维数组可视为其数据元素为n-1维数组的线性表。
North China Electric Power University
★数组的顺序存储分配
传统做法:定义一个二维数组 A[6][6]
North China Electric Power University
2)稀疏矩阵的三元组表示 三元组: ( i, j, value )
15 0 0 22 0 -15 0 11 3 0 0 0 0 0 0 -6 0 0 00 000 0 91 0 0 0 0 0 0 0 28 0 0 0
A[m][n] =
a11 a12 a13 … … a1n
a21 a22 a23 … … a2n
a31 a32 a33 … … a3n
……
……
aij
……
am1 am2 am3 … … amn
i-1 行
若已知每个元素占k个存储单元,并且知道第一 个元素的存储地址 LOC(a11), 则
Loc(aij) = Loc(a11) + (i1)nk + (j1)k = Loc(a11) + [ (i1)n+(j1) ]k
0 -6 0 000
0 0
91 0 0 0 0 0
0 0 28 0 0 0
A[6][6]
66 8 1 1 15 1 4 22 1 6 -15
B= 2 2 11
2 33 3 4 -6 5 1 91 6 3 28
B[9][3]
3) 矩阵的转置
15 0 0 22 0 11 3 0
M= 0 0 0 -6
0000 91 0 0 0
若一个mn阶稀疏矩阵具有t个非零元素,则用t+1个三 元组来存储,其中第一个三元组分别用来给出稀疏矩阵的总 行数m、总列数n 以及非零元素的总个数t ;第二个三元组 到第 t+1 个三元组按行序为主序的方式依次存储t个非零元 素。
15 0 0 22 0 -15
0 11 3 0 0 0
A=
0 0
0 0
A[m][n] =
a11 a12 a13 … … a1n a21 a22 a23 … … a2n
…… …… am1 am2 am3 … … amn
a11 . . . a1n a21 . . . a2n a31 . . . aij . . . amn
……
第1行
第2行
North China Electric Power University
0元素 传统做法:定义一个二维数组 B[n][n]
North China Electric Power University
例. 三对角矩阵的压缩存储
B[n][n] =
b11 b12 b21 b22 b23
b32 b33 b34
0元素
0元素
bn-1n bnn-1 bnn
非零元素的个数为3n-2
North China Electric Power University
相关文档
最新文档