稀疏矩阵

稀疏矩阵是指非零元素个数远少于零元素(通常非零元素比例小于 5%)的矩阵。

三元组表示法

只存储非零元素的行号、列号和值,用一个三元组表表示:

#define MAXSIZE 100
typedef struct {
    int row;   // 行号
    int col;   // 列号
    int value; // 元素值
} Triple;

typedef struct {
    Triple data[MAXSIZE];
    int rows, cols, nums;  // 矩阵行数、列数、非零元素个数
} TSMatrix;

优点:极大节省存储空间。缺点:随机访问某个元素需遍历查找,效率低。

十字链表法

用链表存储非零元素,每个非零元素结点同时挂接在”行链表”和”列链表”上,便于矩阵的加法、乘法等运算。

typedef struct OLNode {
    int row, col, value;
    struct OLNode *right;  // 指向同一行的下一个非零元素
    struct OLNode *down;   // 指向同一列的下一个非零元素
} OLNode, *OLink;

习题

习题 1

稀疏矩阵如何压缩存储?有哪些方法?

答案与解析

稀疏矩阵只存储非零元素及其位置,常用方法:

  1. 三元组表示法:用 (行号, 列号, 值) 的数组存储非零元素,节省空间但随机访问慢。
  2. 十字链表法:非零元素结点同时挂接行链表和列链表,便于矩阵运算。
  3. 压缩行/列存储(CSR/CSC):用三个数组分别存值、列号和行偏移,适合大规模稀疏矩阵计算。

优点:节省存储空间,减少无效运算。缺点:随机访问效率低,算法实现复杂。