数组 特殊矩阵的压缩存储 稀疏矩阵
DESCRIPTION
第 5 章 数组和稀疏矩阵. 数组 特殊矩阵的压缩存储 稀疏矩阵. 数 组. 数组是 n(n>1) 个相同类型数据元素 a 1 , a 2 , …, a n 构成的有限序列。 数组的性质: ( 1 )数组中的数据元素数目固定。( 定长 ) ( 2 )数组中的数据元素具有相同的数据类型。 ( 3 )数组中的每个数据元素都和一组唯一的下标值对应。 ( 4 )数组是一种随机存储结构。可以随机存取数组中的任意数据元素。. m=8. a 33. a 322. 数 组. a 5. 一维数组:. m. 多维数组:. 抽象数据类型数组的定义. - PowerPoint PPT PresentationTRANSCRIPT
数组 特殊矩阵的压缩存储 稀疏矩阵
数 组数 组
数组是 n(n>1) 个相同类型数据元素 aa11, aa22, …, aann 构成的有限序列。
数组的性质:( 1 )数组中的数据元素数目固定。(定长)( 2 )数组中的数据元素具有相同的数据类型。( 3 )数组中的每个数据元素都和一组唯一的下标值对应。( 4 )数组是一种随机存储结构。可以随机存取数组中的任意数据元素。
a33
a322
数 组数 组
一维数组:一维数组:a5
m
多维数组:
m=8
ADT List{ 数据对象 : D={aj1,j2,j3,…,jd|ji=1,2,…,bi,i=1,2,…,d} 数据关系 : R={r1, r2,…, rn} ri, =< aj1,j2,,,ji,…,jn ,aj1,j2j ,,,ji+1,…,jn >| 1jk bk, 1k b 且 ki, 1 ji bi-1,I=2,3,…d 基本运算 : Value(A,index1,index2,…,indexd); Assign(A,e, index1,index2,…,indexd ); Adisp(A,b1 , b2 ,… bd )}
抽象数据类型数组的定义
逻 辑 结 构一维数组: ai
ai-1 ai+1 线性结构
二维数组:
aij aij-1 aij+1 ai-1j
ai+1j
三维数组:
aijk aij-1k aij+1k
aijk+1
aijk-1
ai-1jk
ai+1jk
线性结构推
广
数组的存储结构
由于数组主要随机访问,没有插入和删除,所以采用顺序方式存储。一维数组的存储:按次序依次存储在一组连续的存储空间中。
LOC(ai) = LOC(a1)+(i-1)*k
多维数组的存储:问题:计算机内存是一维,如何存储多维数组。要求:将多维数组中每个元素按某种次序列排列成为一维结构。两种方法:以行为主序顺序和以列为主序顺序。
二维数组行优先顺序存储结构a11 a1n
ai1 aij ain
am1 amn
Amn=
Loc(aij ) = Loc(a11) + [ (i-1)*n + j-1 ]*d
每个元素占存储空间大小为 d
Loc(aij )= 首地址 + 前面所有元素所占存储空间的总数
a11 a1n
第 1 行
ai1 ain
第 i 行
am1 amn
第 m 行
前 i-1 行:有 (i-1)*n 个元素 第 i 行:有 j-1 元素 aij 前共有 (i-1)*n + j-1 个元素
?问题:若第一个元素为 a00 (即下标为 00 )则 Loc(aij)=?
行 aij 前共有 i 行元素 本行前有是 j 个元素
Loc (Loc (aaijij ) = Loc ( ) = Loc (aa0000) + ) + ( ( ii * * nn + + jj ) * ) * dd
Loc(aij ) = Loc(a11) + [ (j-1)*m + (i-1) ]*d
a11 am1
第 1 列
a1j amj
第 j 列
a1n amn
第 n 列
前 j-1 列:有 (j-1)*m 个元素 第 j 列:有 i-1 元素 aij 前共有 (j-1)*m + i-1 个元素
每个元素占存储空间大小为 d
Loc(aij )= 首地址 + 前面所有元素所占存储空间的总数?问题:若第一个元素为 a00 (即下标为 00 )则 Loc(aij)=?
列 aij 前共有 j 列元素 本列前有是 i 个元素
Loc (Loc (aaijij ) = Loc () = Loc (aa0000) + ) + ( ( jj* * mm + + ii ) * ) * dd
a11 a1n
ai1 aij ain
am1 amn
Amn=
二维数组列优先顺序存储结构
三维数组三维数组 AmAmnnpp
Loc (aijk ) = Loc (a111) + [ (i-1)* n * p + (j-1)* p + k-1)] * d
行优先顺序:
Loc (aijk ) = Loc (a111) + [ (i-1) + (j-1)* m+ (k-1)*m*n] * d
列优先顺序:
a111 …a11p a121…a12p …a1n1 … a1np a211 … a21p … amn1 … amnp
a111 …am11 a121…am21 …a1n1 … amn1 a112 … am12 … a1np … amnp
特殊矩阵的压缩存储特殊矩阵的压缩存储
a11 a1n
ai1 aij ain
am1 amn
Amn=通常可以采用二维数组存储矩阵空间复杂度: S(m,n)=O(m*n)
问题:( 1)矩阵中有大量相同的非零元素
这样仍造成空间极大浪费
多个相同的非零元素只分配一个存储空间
矩阵压缩存储原则
特殊矩阵特殊矩阵是指非零元素或零元素的分布有一是指非零元素或零元素的分布有一定规律的矩阵。定规律的矩阵。 对称矩阵、三角矩阵、对角矩阵对称矩阵、三角矩阵、对角矩阵
333020121
30410235
2010793
12239118
15384
A
对称矩阵特点:对称矩阵特点: aij = aji
只需存储上三角或下三角中的元素
nnnnn
n
n
n
aaaa
aaaa
aaaa
aaaa
321
3333231
2232221
1131211
A
SA a11 a21 a22 a31 a32 a33 a41 a42 a43 …… ann
0 1 2 3 4 5 6 7 8 9 n(n+1)/2-1
a32 和 a23 存储在 SA[5]
矩阵中 n*n 个元素只需要 n(n+1)/2 个存储单元
SA[k]= aijK=
i(i-1) 2
+ j-1 ij
i<jj(j-1) 2
+ i-1
nn
n
n
n
accc
aacc
aaac
aaaa
333
22322
1131211
A
nnnnn aaaa
caaa
ccaa
ccca
321
333231
2221
11
A
下三角矩阵
上三角矩阵
datatype SA[ ]n(n+1) 2 +1
(i-1)(2n-i+2) 2 + j-i+1 ij
i>jK=
n(n+1) 2
datatype SA[ ]n(n+1) 2 + 1
i(i-1) 2
+ j-1 ij
i<jK=
n(n+1) 2
三对角矩阵三对角矩阵
nnnn
nnnnnn
aa
aaa
aaa
aaa
aa
1
11121
343332
232221
1211
0000
000
000
000
0000
A
0 1 2 3 4 5 6 7 8 9 3n-2
第 1 行 第 2 行 第 3 行 第 n 行
SA a11 a12 a21 a22 a23 a32 a33 a34 … ann-1 ann
|i-j|1K=2i+j-2-1
|i-j|>1aij=0
稀疏矩阵稀疏矩阵 设矩阵设矩阵 Am*nAm*n 中有中有 ss 个非零元素,若个非零元素,若 ss 远远小于矩远远小于矩
阵元素的总数(即阵元素的总数(即 s<<m*n), s<<m*n), 则称则称 AA 为为稀疏矩阵稀疏矩阵。。
00940
00006
00020
00301
80050
A
m=5, n=5, s=8 s<<m*n
由于非零元素在矩阵中的位置没有规律,所以不但要存储非零元素的值,而且还要存储其在矩阵中的位置。
三元组 ( i, j , aij)
(1,2,5) (1,5,8) (2,1,1) (2,3,3)(3,2,-2) (4,1,6) (5,2,4) (5,3,-9)
存储方式:三元组表和十字链表
00940
00006
00020
00301
80050
A
1 2 5 1 5 8 2 1 1 2 3 3 3 2 -2 4 1 6 5 2 4 5 3 -9
三元组表--稀疏矩阵的顺序存储方式
typedef struct { int r, c; /* 行号、列号 */
ElemType d; /* 非零元素值 */
}TupNode;typedef struct{ int rows,cols,nums; /* 行数、列数、非零元素个数 */
TupNode data[maxsize]; /* 三元组表 */
}TSMatrix;
i j v12345678
smax
稀疏矩阵的数据类型
便于随机存取,但不适合矩阵的变化(即非零元素的位置及个数的变化)。
2 1 5 5 1 8 1 2 1 3 2 3 2 3 -2 1 4 6 2 5 4 3 5 -9
1 2 1 1 4 6 2 1 5 2 3 -2 2 5 4 3 2 3 3 5 -9 5 1 8
1 2 5 1 5 8 2 1 1 2 3 3 3 2 -2 4 1 6 5 2 4 5 3 -9
i j v12345678
maxsize
00940
00006
00020
00301
80050
A
00008
00000
90030
40205
06010
B
i j v12345678
maxsize
A ( i, j , aij)
B ( j, i , bij)
?行优先变成列优先
( 1 )全部传送( 2 )分列传送
? T=O(n*t) 效率低
求转置矩
阵
1 2 1 1 4 6 2 1 5 2 3 -2 2 5 4 3 2 3 3 5 -9 5 1 8
1 2 5 1 5 8 2 1 1 2 3 3 3 2 -2 4 1 6 5 2 4 5 3 -9
i j v12345678
maxsize
i j v12345678
maxsize
pot[1]
pot[2]
pot[3]
pot[4]pot[5]
最好先确好 A 中各列传送的起始位置设 pot[n] 用于存储各列的起始位置pot[1]=1pot[col]=pot[col-1]+num[col-1] (num[n] 各列非零个数)
col 1 2 3 4 5num 2 3 2 0 1pot 1 3 6 8 8
分析: 求 num[ ] T=O(t) 求 pot [ ] T=O(n) 三元传送 T=O(t) T=O(n+t)
00940
00006
00020
00301
80050
A
十字链表--稀疏矩阵的链式存储方式
非零结点结构:
row col valuedown right
指向本行下一个非零结点
分析:将同一行的非零结点链成一个循环单链表 将同一列的非零结点链成一个循环单链表要求:每个结点设两个指针分别用于行和列链接
为运算方便每个链表设一个头结点 0 0 linkdown right
指向本列下一个非零结点
00940
00006
00020
00301
80050
A
1 2 5
2 1 1 2 3 3
3 2 -2
4 1 6
5 2 4 5 3 -9
1 5 8
0 0 0 0 0 0 0 0
0 0
H1 H2 H3 H4 H5
H1
H2
H3
H4
H5
0 0
0 0
0 0
0 0
0 0
注: i 行头结点中只用 rptr, i 列头结点中只用 cptr, 则可合用共享。
0 0down right
指向本行第一个非零结点
指向本列下一个非零结点
行列头结点
利用这个数据域设指针将各行列头结点链接。
5 5
Hm
link
行列表头结点存储矩阵的行数和列数, Hm 确定十字链表
结 点 结 构 row col value/link down right
非零结点:( row, col, value) 为非零元素的三元组。行列头结点: row=col=0 link 指向下一个行列头结点。行列表头结点: row 为矩阵的行数 col 为阵的列数
结点数据类型typedef struct mtxn{ int row,col; struct mtxn *right,*down; union { int value; struct mtxn *link; }tag;}MatNode;
小 结数组:逻辑结构是线性结构的推广 。数组的特点是定长。(没有插入和删除)数组采用顺序方式存储,二种排列方式:以行为主序排列和以列为主序排列。
特殊矩阵的压缩存储:多个相同元素分配一个存储单元 对称矩阵、三角矩阵、对角矩阵稀疏矩阵的压缩存储:零元素不分配存储空间, 只存储非零元素的三元组。 顺序方式:三元组表 链式方式:十字链表