04 数组
4.1 数组的定义和特点
矩阵可以看做是特殊的线性表,即线性表元素本身又是一个线性表(将整行(列)看做成一个元素,而这个元素本身也是线性表)。
4.2 数组的顺序存储结构
按行(或列)序依次存储各个元素。
4.3 矩阵的压缩存储
对一些阶数很高、而又有很多零元素的矩阵,可采用压缩存储的方式,也就是仅存储非零元素,相同元素仅存储一个。压缩存储后,若能得到各元素的地址,则可进行随机存取。(这里均按行序存储)
4.3.1 特殊矩阵的压缩存储
特殊矩阵包括对称矩阵、三角矩阵、对角矩阵。
(1)对阵矩阵
也就是沿主对角线,两侧对称元素相等,即 a i j = a j i a_{ij}=a_{ji} aij=aji。那么一共需存储 ( 1 + n ) n 2 \frac{(1+n)n}{2} 2(1+n)n 个元素。以按下三角存储为例:
L o c ( a i j ) = L o c ( a 11 ) + ( i ( i − 1 ) 2 + j − 1 ) ∗ L , ( i > = j ) (按行序,下三角存储) L o c ( a i j ) = L o c ( a 11 ) + ( j ( j − 1 ) 2 + i − 1 ) ∗ L , ( i < j ) (按列序,上三角存储) \mathrm{Loc(a_{ij})}=\mathrm{Loc(a_{11})+(\frac{i(i-1)}{2}+j-1)*L}, \quad \mathrm{(i>=j)} (按行序,下三角存储) \\ \mathrm{Loc(a_{ij})}=\mathrm{Loc(a_{11})+(\frac{j(j-1)}{2}+i-1)*L}, \quad \mathrm{(i<j)} (按列序,上三角存储) Loc(aij)=Loc(a11)+(2i(i−1)+j−1)∗L,(i>=j)(按行序,下三角存储)Loc(aij)=Loc(a11)+(2j(j−1)+i−1)∗L,(i<j)(按列序,上三角存储)
(2)三角矩阵
以下三角矩阵为例(也就是上三角部分都为零):
L o c ( a i j ) = L o c ( a 11 ) + ( i ( i − 1 ) 2 + j − 1 ) ∗ L , ( i > = j ) \mathrm{Loc(a_{ij})}=\mathrm{Loc(a_{11})+(\frac{i(i-1)}{2}+j-1)*L}, \quad \mathrm{(i>=j)} Loc(aij)=Loc(a11)+(2i(i−1)+j−1)∗L,(i>=j)
(3)对角矩阵
4.3.2 稀疏矩阵
稀疏矩阵是指非零元素较少,且分布没有一定规律的矩阵。压缩存储时,只需储存行、列下标和元素值以及矩阵维数即可。例如矩阵 M \mathrm{M} M 可由 ( i , j , v a l u e ) . . . \mathrm{(i, j, value)}... (i,j,value)... 和维数 ( m , n ) \mathrm{(m, n)} (m,n) 唯一确定。
1、稀疏矩阵的顺序存储
(1)三元组表法
定义一个三元组 ( i , j , e ) \mathrm{(i, j, e)} (i,j,e)
typedef struct
{
int i, j; // 非零元的下标
ElemType e; // 非零元的值
}Triple;
将各个三元组一次存储,组成稀疏矩阵
#define MAXSIZE 100 // 非零元最大个数
typedef struct
{
Triple data[MAXSIZE + 1]; // data[0] 放 mu、nu、tu
int mu, nu, tu; // 分别表示行数、列数和非零元个数
}TSMatrix;
(2)带行逻辑链接的顺序表——带行链接信息的三元组表
(3)伪地址表示法
2、稀疏矩阵的链式存储