数据结构:特殊矩阵 及其存储
特殊矩阵的压缩存储是一种优化存储空间的技术,主要针对具有许多相同矩阵元素或零元素,且这些元素分布具有一定规律性的矩阵。这些矩阵包括对称矩阵、三角矩阵(上三角矩阵和下三角矩阵)、对角矩阵(如三对角矩阵)以及稀疏矩阵等。以下是对这些特殊矩阵压缩存储的详细介绍及例子。
一、特殊矩阵的定义及特点
- 对称矩阵:
- 定义:若一个n阶方阵A中的元素满足a_ij = a_ji(1≤i, j≤n),则称A为对称矩阵。
- 特点:矩阵元素关于主对角线对称。
- 三角矩阵:
- 定义:若一个n阶方阵A的上(或下)三角区元素均为同一常量(或零),则称A为上(或下)三角矩阵。
- 特点:矩阵的一半元素具有相同的值。
- 对角矩阵:
- 定义:若一个n阶方阵A中的非零元素都集中在以主对角线为中心的带状区域中,则称A为对角矩阵。特别地,当带状区域的宽度为1时,称为三对角矩阵。
- 特点:矩阵的大部分元素为零,非零元素集中在主对角线及其附近的带状区域内。
- 稀疏矩阵:
- 定义:矩阵中零元素的个数远远多于非零元素的个数,且非零元素的分布没有特定规律的矩阵称为稀疏矩阵。
- 特点:矩阵的大部分元素为零。
二、压缩存储的方法
- 对称矩阵:
- 方法:只存储上三角区(或下三角区)的元素,另一半元素可以通过对称性得出。
- 例子:对于一个3阶对称矩阵A,其元素为:
A = | a11 a12 a13 | | a21 a22 a23 | | a31 a32 a33 |
由于对称性,只需存储上三角(或下三角)部分,如只存储下三角部分:
a11, a21, a22, a31, a32, a33
,这些元素可以存放在一维数组B中。
对于对称矩阵,由于矩阵元素关于主对角线对称,因此只需要存储上三角区(或下三角区)的元素即可。在压缩存储时,通常将上三角区(不包括主对角线)的元素按照行优先的顺序存储到一个一维数组中。对于元素a[i][j]
(其中i < j
,即上三角区元素),其在一维数组中的位置k
可以通过以下公式计算得出:
这里,i
和j
分别是二维数组中的行下标和列下标(通常从0开始),而k
是一维数组中的下标。这个公式基于等差数列求和的思想,首先计算出第i
行之前(包括第i
行)所有元素的总数,然后再加上第i
行中从第i
列到第j
列(不包括第i
列)的元素数。
- 三角矩阵:
- 方法:只存储非常量元素所在的区域(即上三角区或下三角区中的非常量元素),常量元素则无需存储。
- 例子:对于一个3阶下三角矩阵A,其元素为(假设上三角区元素全为0):
A = | a11 0 0 | | a21 a22 0 | | a31 a32 a33 |
只需存储下三角部分(包括主对角线):
a11, a21, a22, a31, a32, a33
对于上三角矩阵,由于下三角区的所有元素均为同一常量(通常为0),因此只需要存储主对角线及其以上的元素。在压缩存储时,同样可以采用一维数组来存储这些元素。对于元素a[i][j]
(其中i <= j
,即包括主对角线),其在一维数组中的位置k
可以通过以下公式计算得出:
或者,更简洁地表示为(注意这里的下标可能从1开始计数,具体取决于实现):
其中,n
是矩阵的阶数,i
和j
是二维数组中的行下标和列下标,k
是一维数组中的下标。这个公式考虑了上三角矩阵中每行元素数量的递减特性。
- 对角矩阵:
- 方法:只存储带状区域内的非零元素,其余元素默认为零,无需存储。
- 例子:对于一个3阶三对角矩阵A,其元素为:
A = | a11 a12 0 | | a21 a22 a23 | | 0 a32 a33 |
只需存储三条对角线上的元素:
a11, a12, a21, a22, a23, a32, a33
对于三对角矩阵,非零元素仅出现在主对角线上以及主对角线上方和下方的各一条对角线上。在压缩存储时,可以将这些非零元素按行优先的顺序存储到一个一维数组中。对于元素
a[i][j]
(其中|i - j| <= 1
),其在一维数组中的位置k
可以通过以下公式计算得出:或者,如果数组下标从0开始,则:
这里,
i
和j
分别是二维数组中的行下标和列下标,k
是一维数组中的下标。这个公式基于三对角矩阵中每行非零元素数量的固定性(对于n
阶矩阵,每行有3个非零元素,但第一行和最后一行可能少于3个)。
- 稀疏矩阵:
- 方法:常见的压缩存储方法包括顺序存储(如三元组表)和链式存储(如十字链表)。
- 例子:对于一个4x5的稀疏矩阵A,其非零元素较少,可以使用三元组表
(i, j, aij)
来存储非零元素的位置和值。
三、压缩存储的优势
- 节省存储空间:通过只存储必要的元素,显著减少存储空间的占用。
- 提高存储效率:对于大规模的特殊矩阵,通过压缩存储可以显著提高程序的运行效率。
- 简化矩阵运算:在压缩存储的基础上,可以简化矩阵的运算过程,提高运算速度。