5-3 矩阵的压缩存储

1.矩阵定义:一个由 m×n 个元素排成的 m 行(横向)n 列(纵向)的表。 

2.矩阵的常规存储:将矩阵描述为一个二维数组

3. 矩阵的常规存储的特点:

  可以对其元素进行随机存取;

  矩阵运算非常简单;存储的密度为 1。

4.不适宜常规存储的矩阵:值相同的元素很多且呈某种规律分布;零元素多。 

5.矩阵的压缩存储:为多个相同的非零元素只分配一个存储空间;对零元素不分配空间。

 

特殊矩阵:元素值的排列具有一定规律的矩阵。

1. 对称矩阵、下、上三角矩阵、对角线矩阵等

对称矩阵:在一个 n 阶方阵 A 中,若元素满足下述性质:aij = aji    1 ≤ i,  j ≤ n 则称 A 为对称矩阵。

 

M 由 {(1,2,12),  (1,3,9),  (3,1,-3),  (3,6,14), (4,3,24), (5,2,18), (6,1,15), (6,4,-7) } 和矩阵维数 (6, 7) 唯一确定

(三元组 (i, j, aij) 惟一确定矩阵的一个非零元。)

 

压缩存储原则:存各非零元的值、行列位置和矩阵的行列数。

三元组的不同表示方法可决定稀疏矩阵不同的压缩存储方法。

 

1、稀疏矩阵的压缩存储方法——顺序存储结构

2、三元组顺序表

#define MAXSIZE 12500  

             //假设非零元个数的最大值

typedef   struct {

     int  i, j;    //该非零元的行列下标

     ElemType  e;

}Triple;

typedef  struct {

     Triple  data[MAXSIZE + 1];

      int       mu, nu, tu;  

     //矩阵的行、列数和非零元个数

}TSMatrix;

#define MAXSIZE 12500  
             //假设非零元个数的最大值 
typedef   struct { 
     int  i, j;    //该非零元的行列下标 
     ElemType  e; 
}Triple; 
typedef  struct { 
     Triple  data[MAXSIZE + 1]; 
      int       mu, nu, tu;  
     //矩阵的行、列数和非零元个数 
}TSMatrix;

已知一个稀疏矩阵的三元组表,求该矩阵转置矩阵的三元组表。

 一般矩阵转置算法:

for (col = 1;  col <= nu;  ++ col)

     for (row = 1;  row <= mu;   ++ row)

            T[col][row] = M[row][col];

一般矩阵转置算法时间复杂度:O(mu x nu)  

用三元组顺序表存储的矩阵转置算法时间复杂度:O(nu x tu)

结论:

用三元组顺序表存储稀疏矩阵节约存储空间(优点);

tu与mu´nu同数量级时,算法时间复杂度高(缺点);

算法仅适用于 tu << mu´nu 的情况。

mu nu tu分别代表行数、列数、非零元的个数

 

猜你喜欢

转载自blog.csdn.net/weixin_42202174/article/details/89401255
5-3