特殊矩阵的压缩存储
压缩存储:指为多个值相同的元素只分配一个存储空间,对零元素不分配空间。
特殊矩阵:指具有许多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的分布有一定规律性的矩阵。常见的特殊矩阵有对称矩阵、上(下)三角矩阵、对角矩阵等。
特殊矩阵的压缩存储方法:找出特殊矩阵中值相同的矩阵元素的分布规律,把那些呈现规律性分布的、值相同的多个矩阵元素压缩存储到一个存储空间中。
对称矩阵
对一个n阶矩阵A的任意一个元素ai,j都有ai,j=aj,i(1≤i,j≤n)
对称矩阵中的元素可以划分为3个部分,即上三角区(i < j)、主对角线(i = j)和下三角区(i > j)。
对于n阶对称矩阵,上三角区的所有元素和下三角区的对应元素相同,若仍采用二维数组存放,则会浪费几乎一半的空间,为此将n阶对称矩阵A存放在数组B[n(n+1)/2]中,即元素ai,j存放在bk中。比如只存放下三角部分(含主对角线)的元素。
元素ai,j在数组B中的下标k=1+2+...+(i−1)+j−1=i(i−1)/2+j−1(数组下标从0开始)
因此,元素下标之间的对应关系如下:
k={2i(i−1)+j−1,2j(j−1)+i−1,i≥j (下三角区和主对角线元素)i<j (上三角区元素ai,j=aj,i)
关于映射
以下图为例。
行优先存储
将a3,2映射到一位数组中,那么此时i = 3, j = 2,前i - 1
行的元素是可以通过行数(i)得到的,第i
行元素的个数通过j得到。
因此前i - 1行的元素个数为1+2+...+(i−1),第i行的元素个数为j。
整理之后可得元素ai,j在数组B中的下标k=2i(i−1)+j−1,此处 -1 是因为一维数组B的下标从0开始,若从1开始,则不需要减一。
列优先存储
将an,3映射到一位数组中,那么此时i = n, j = 3,前j - 1
列的元素是可以通过列数(j)得到的,第j
列元素的个数通过i得到。
因此前j - 1列的元素个数为n+(n−1)+...+(n−j+2),第j列的元素个数为i−j。
这里的n - j + 2
递推可以得到,第j列的元素个数是n−j+1个,那么显然第j - 1列的元素比第j列要多一个。
若数组下标从0开始,则映射为k=2(j−1)(2n−j+2)+(i−j),若从1开始,则无需-1.
三角矩阵
对于矩阵,若另一边的三角区均为同一常量,则成为三角矩阵。
三角矩阵分为上三角矩阵和下三角矩阵。
可以将n阶三角矩阵A压缩存储在B[n(n+1)/2+1]中,+ 1
是为了存储那个均为同一常量的三角区的元素。
上三角矩阵
元素下标之间的对应关系为:
k={2i(i−1)+j−1,2n(n+1),i≥j (下三角区和主对角线元素)i<j (上三角区元素)
下三角矩阵
元素下标之间的对应关系为:
k={2(i−1)(2n−i+2)+(j−i),2n(n+1),i≤j (上三角区和主对角线元素)i>j (下三角区元素)
此处的上三角区和主对角线的映射关系和上述的列优先存储思想类似。
三对角矩阵
三对角矩阵也称带状矩阵。
对n阶矩阵A中的任意一个元素ai,j,当∣i−j∣>1时,若有ai,j=0(1≤i,j≤n),则成为三对角矩阵。
在三对角矩阵中,所有非零元素都集中在以主对角线为中心的3条对角线的区域,其他区域的元素都为0。
可以计算矩阵A中3条对角线上的元素ai,j(1≤i,j≤n,∣i−j∣≤1)在一维数组B中存放的下标为 k=2i+j−3。
反之,若已知三对角矩阵中的某个元素ai,j存放在一维数组B的第k个位置,则有i=⌊3k+1+1⌋,j=k−2i+3。
稀疏矩阵
矩阵中非零元素的个数t,相对矩阵元素的个数s来说非常少,即s>t的矩阵称为稀疏矩阵。
若采用常规的方法存储稀疏矩阵,则相当浪费时间,因此仅存储非零元素。但通常非零元素的分布无规律可言,所以仅存储非零元素的值是不够的,还应该存储它的位置,即所在的行和列。
因此,将非零元素及其相应的行和列构成一个三元组(行标,列表,值)。按照某种规律存储这些三元组线性表。
稀疏矩阵压缩存储后便失去了随机存取特性。
稀疏矩阵的三元组表既可以采用数组存储,又可以采用十字链表存储。
当存储稀疏矩阵时,不仅要保存三元组表,而且要保存稀疏矩阵的行数、列数和非零元素的个数。