2.9 特殊矩阵的压缩存储

damone大约 3 分钟

2.9 特殊矩阵的压缩存储

2.9.1 数组的存储结构

一维数组a[N]a[N] 逻辑上连续存放,物理上(内存中)也连续存放 数组元素a[i]a[i]物理地址=LOC+i*sizeof(ElemType)

二维数组a[N][M]a[N][M] 逻辑上是n行n列的矩阵,物理上(内存中)是行优先存储列优先存储的连续存放 行优先存储:数组元素a[i][j]a[i][j]物理地址=LOC+(i*N+j)*sizeof(ElemType)列优先存储:数组元素a[i][j]a[i][j]物理地址=LOC+(J*M+i)*sizeof(ElemType)

普通矩阵的存储可用二维数组存储。

2.9.2 特殊矩阵的存储

①对称矩阵 ②三角矩阵 ③三对角矩阵 ④稀疏矩阵

对称矩阵的压缩存储

对称矩阵ai,j=aj,ia_{i,j}=a_{j,i} 方法:一维数组a[N]a[N]只存主对角线+下三角区(或主对角线+上三角区) 存储数组的大小:N=n(n+1)2N=\frac{n(n+1)}{2} 数组下标范围:00 ~ n(n+1)21\frac{n(n+1)}{2}-1行优先存储:数组下标:k={i(i1)2+j1,ij(下三角区和主对角线元素)j(j1)2+i1,i<j(上三角区元素ai,j=aj,i)k=\begin{cases} \frac{i(i-1)}{2}+j-1, \quad i \geq j(下三角区和主对角线元素)\\ \frac{j(j-1)}{2}+i-1, \quad i<j(上三角区元素a_{i,j}=a_{j,i}) \end{cases}

三角矩阵的压缩存储

下三角矩阵:除主对角线和下三角区,其余的元素都相等 方法:一维数组a[N]a[N]存主对角线+下三角区,在最后多加一个位置存常其余相等元素 存储数组的大小:N=n(n+1)2+1N=\frac{n(n+1)}{2}+1 数组下标范围:00 ~ n(n+1)2\frac{n(n+1)}{2}行优先存储:数组下标:k={i(i1)2+j1,ij(下三角区和主对角线元素)n(n+1)2,i<j(上三角区元素)k=\begin{cases} \frac{i(i-1)}{2}+j-1, \quad i \geq j(下三角区和主对角线元素)\\ \frac{n(n+1)}{2}, \quad\quad\quad\quad i<j(上三角区元素) \end{cases}

上三角矩阵:除主对角线和上三角区,其余的元素都相等 方法:一维数组a[N]a[N]存主对角线+下三角区,在最后多加一个位置存常其余相等元素 存储数组的大小:N=n(n+1)2+1N=\frac{n(n+1)}{2}+1 数组下标范围:00 ~ n(n+1)2\frac{n(n+1)}{2}行优先存储:数组下标:k={(i1)(2ni+2)2+(ji),ij(下三角区和主对角线元素)n(n+1)2, i<j(上三角区元素)k=\begin{cases} \frac{(i-1)(2n-i+2)}{2}+(j-i), \quad i \geq j(下三角区和主对角线元素)\\ \frac{n(n+1)}{2}, \quad\quad\quad\quad\quad\quad\quad~ i<j(上三角区元素) \end{cases}

三对角矩阵的压缩存储

三对角矩阵,又称带状矩阵。 方法:一维数组a[N]a[N]存带状部分 存储数组的大小:N=3n3+1N=3n-3+1 数组下标范围:00 ~ 3n33n-3行优先存储i和j计算数组下标kk=2i+j3k=2i+j-3数组下标k计算i和ji=(k+2)/3i=\lceil (k+2)/3 \rceilj=k2i+3j=k-2i+3

稀疏矩阵的压缩存储

稀疏矩阵:非零元素的个数远远少于矩阵元素的个数。

方法一:顺序存储——三元组<行,列,值>,注:行列从1开始

i(行)j(列)v(值)
134
165
223

方法二:链式存储——十字链表法

1637932175187
1637932175187