数组 特殊矩阵的压缩存储 稀疏矩阵

22
数数 数数数数数数数数数 数数数数

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 Presentation

Transcript of 数组 特殊矩阵的压缩存储 稀疏矩阵

Page 1: 数组 特殊矩阵的压缩存储 稀疏矩阵

数组 特殊矩阵的压缩存储 稀疏矩阵

Page 2: 数组 特殊矩阵的压缩存储 稀疏矩阵

数 组数 组

数组是 n(n>1) 个相同类型数据元素 aa11, aa22, …, aann 构成的有限序列。

数组的性质:( 1 )数组中的数据元素数目固定。(定长)( 2 )数组中的数据元素具有相同的数据类型。( 3 )数组中的每个数据元素都和一组唯一的下标值对应。( 4 )数组是一种随机存储结构。可以随机存取数组中的任意数据元素。

Page 3: 数组 特殊矩阵的压缩存储 稀疏矩阵

a33

a322

数 组数 组

一维数组:一维数组:a5

m

多维数组:

m=8

Page 4: 数组 特殊矩阵的压缩存储 稀疏矩阵

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 )}

抽象数据类型数组的定义

Page 5: 数组 特殊矩阵的压缩存储 稀疏矩阵

逻 辑 结 构一维数组: 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

线性结构推

广

Page 6: 数组 特殊矩阵的压缩存储 稀疏矩阵

数组的存储结构

由于数组主要随机访问,没有插入和删除,所以采用顺序方式存储。一维数组的存储:按次序依次存储在一组连续的存储空间中。

LOC(ai) = LOC(a1)+(i-1)*k

多维数组的存储:问题:计算机内存是一维,如何存储多维数组。要求:将多维数组中每个元素按某种次序列排列成为一维结构。两种方法:以行为主序顺序和以列为主序顺序。

Page 7: 数组 特殊矩阵的压缩存储 稀疏矩阵

二维数组行优先顺序存储结构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

Page 8: 数组 特殊矩阵的压缩存储 稀疏矩阵

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=

二维数组列优先顺序存储结构

Page 9: 数组 特殊矩阵的压缩存储 稀疏矩阵

三维数组三维数组 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

Page 10: 数组 特殊矩阵的压缩存储 稀疏矩阵

特殊矩阵的压缩存储特殊矩阵的压缩存储

a11 a1n

ai1 aij ain

am1 amn

Amn=通常可以采用二维数组存储矩阵空间复杂度: S(m,n)=O(m*n)

问题:( 1)矩阵中有大量相同的非零元素

这样仍造成空间极大浪费

多个相同的非零元素只分配一个存储空间

矩阵压缩存储原则

Page 11: 数组 特殊矩阵的压缩存储 稀疏矩阵

特殊矩阵特殊矩阵是指非零元素或零元素的分布有一是指非零元素或零元素的分布有一定规律的矩阵。定规律的矩阵。 对称矩阵、三角矩阵、对角矩阵对称矩阵、三角矩阵、对角矩阵

333020121

30410235

2010793

12239118

15384

A

对称矩阵特点:对称矩阵特点: aij = aji

只需存储上三角或下三角中的元素

Page 12: 数组 特殊矩阵的压缩存储 稀疏矩阵

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

Page 13: 数组 特殊矩阵的压缩存储 稀疏矩阵

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

Page 14: 数组 特殊矩阵的压缩存储 稀疏矩阵

三对角矩阵三对角矩阵

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

Page 15: 数组 特殊矩阵的压缩存储 稀疏矩阵

稀疏矩阵稀疏矩阵 设矩阵设矩阵 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)

存储方式:三元组表和十字链表

Page 16: 数组 特殊矩阵的压缩存储 稀疏矩阵

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

稀疏矩阵的数据类型

便于随机存取,但不适合矩阵的变化(即非零元素的位置及个数的变化)。

Page 17: 数组 特殊矩阵的压缩存储 稀疏矩阵

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) 效率低

求转置矩

Page 18: 数组 特殊矩阵的压缩存储 稀疏矩阵

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)

Page 19: 数组 特殊矩阵的压缩存储 稀疏矩阵

00940

00006

00020

00301

80050

A

十字链表--稀疏矩阵的链式存储方式

非零结点结构:

row col valuedown right

指向本行下一个非零结点

分析:将同一行的非零结点链成一个循环单链表 将同一列的非零结点链成一个循环单链表要求:每个结点设两个指针分别用于行和列链接

为运算方便每个链表设一个头结点 0 0 linkdown right

指向本列下一个非零结点

Page 20: 数组 特殊矩阵的压缩存储 稀疏矩阵

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 确定十字链表

Page 21: 数组 特殊矩阵的压缩存储 稀疏矩阵

结 点 结 构 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;

Page 22: 数组 特殊矩阵的压缩存储 稀疏矩阵

小 结数组:逻辑结构是线性结构的推广 。数组的特点是定长。(没有插入和删除)数组采用顺序方式存储,二种排列方式:以行为主序排列和以列为主序排列。

特殊矩阵的压缩存储:多个相同元素分配一个存储单元 对称矩阵、三角矩阵、对角矩阵稀疏矩阵的压缩存储:零元素不分配存储空间, 只存储非零元素的三元组。 顺序方式:三元组表 链式方式:十字链表