数组:

一维数组:

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_对称矩阵

 二维数组:

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_算法_02

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_二维数组_03

 数组特性

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_二维数组_04

一维数组的存储结构:

(loc为..的地址)

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_二维数组_05

 二维数组的存储结构:

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_一维数组_06

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_数据结构_07

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_算法_08

特殊矩阵的压缩储存:

对称矩阵:

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_算法_09

由于对称性,不妨只讨论主对角线和下三角的情况

当i>=j时,元素在下半部分

讨论下标为i,j在一维数组中的下标:(即求按照行优先储存下标i,j前一共有多少个元素)

行下标为0的行有1个元素

行下标为1的行有2个元素

......

行下标为i的行前一共有1+2+3+..+i=(1+i)*(i)/2

列下标j说明i,j前有j列,下标i,j是第(1+i)*(i)/2+j+1个元素

所以,下标i,j的元素在压缩矩阵中对应的下标为(1+i)*(i)/2+j

由对称性可得,当i<j时,i,j的元素在压缩矩阵中对应的下标为(j+1)*j/2+i

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_一维数组_10

 结论:

对称矩阵下标i,j     压缩矩阵下标k,则有

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_二维数组_11

对称矩阵压缩后压缩矩阵仍具有随机存储性

上三角矩阵:

主对角线下发元素都相等

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_算法_12

 

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_对称矩阵_13

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_算法_14

 推导:上三角矩阵中a(i,j)在压缩矩阵的下标k

行下标为0的行   有n个元素

行下标为1的行   有n-1个元素

行下标为2的行   有n-2个元素

......

行下标为i-1的行:n-i+1个元素

行下标为i的行:   前面有j-i个元素

k=n+(n-1)+...+(n-i+1)+j-i=(n+n-i+1)*(i)/2+j-i=(2n-i+1)*i/2+j-i

当i<j时,a(i,j)为常数储存在压缩矩阵的最后一个位置,上三角+主对角线一共1+2+3+...+n=(1+n)*n/2,所以最后一个下标为(1+n)*n/2

结论:

上三角矩阵中a(i,j)在压缩矩阵的下标k

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_二维数组_15

例题:

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_数据结构_16

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_算法_17

 

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_数据结构_18

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_数据结构_19

 

【数据结构和算法笔记】数组(数组的储存方式和特殊矩阵的压缩储存)_数据结构_20