数据结构 稀疏矩阵的压缩方法 待补充

本文详细介绍了稀疏矩阵的定义与存储方法,包括三元组顺序表、行逻辑链接顺序表及十字链表。并通过稀疏因子计算判断矩阵是否为稀疏矩阵,旨在优化存储空间并提高运算效率。

来自 严蔚敏《数据结构》

稀疏矩阵的压缩方法主要有:

1:三元组顺序表 (行下标,列下标,值)
2:行逻辑链接的顺序表。
3:十字链表。

什么是稀疏矩阵:

 在矩阵中,我们常见的都是稠密矩阵,即非0元素数目占大多数时;若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵。与之相区别的是,如果非零元素的分布存在规律(如上三角矩阵、下三角矩阵、对角矩阵),则称该矩阵为特殊矩阵。下图1为一个稀疏矩阵的示例
在这里插入图片描述
 稀疏因子是用于描述稀疏矩阵的非零元素的比例情况。设一个n*m的稀疏矩阵A中有t个非零元素,则稀疏因子δ的计算公式如下:δ=t/(n∗m), 当这个值小于等于0.05时,可以认为是稀疏矩阵.

稀疏矩阵的存储方式

 存储矩阵的一般方法是采用二维数组,其优点是可以随机地访问每一个元素,因而能够较容易地实现矩阵的各种运算。但对于稀疏矩阵而言,若用二维数组来表示,会重复存储了很多个0了,浪费空间,而且要花费时间来进行零元素的无效计算。所以必须考虑对稀疏矩阵进行压缩存储。
 最常用的稀疏矩阵存储格式主要有:三元组(i,j,a(i,j))和CSR(Compressed Sparse Row)以及十字链表法

三元组

  三元组(i,j,a(i,j))(也叫COO(Coordinate Format))
  三元组(i,j,a(i,j))很简单,就是使用3个数组,分别存储全部非零元的行下标(row index)、列下标(column index)和值(value)

typedef struct
{
    int row;        //行坐标
    int col;        //列坐标
    int value;    //该点的值
} item;

 这里item表示矩阵中的非0点,用item[num+1]来表示一个矩阵,至于为什么是num+1,这是因为item数组的首值为{行数,列数,非0值个数}结构,除首值外,其余值表示的矩阵中非0值的行列坐标以及其值
在这里插入图片描述
 这种方式简单,但是记录单信息多(行列),每个三元组自己可以定位,因此空间不是最优。

十字链表(Orthogonal List)

 十字链表(Orthogonal List)是有向图的另一种链式存储结构。该结构可以看成是将有向图的邻接表和逆邻接表结合起来得到的。用十字链表来存储有向图,可以达到高效的存取效果。同时,代码的可读性也会得到提升。
 我们知道稀疏矩阵的三元组存储方式的实现很简单,每个元素有三个域分别是i, j, e。代表了该非零元的行号、列号以及值。那么在十字链表的存储方式下,首先这三个域是肯定少不了的,不然在进行很多操作的时候都要自己使用计数器,很麻 烦。而十字链表的形式大家可以理解成每一行是一个链表,而每一列又是一个链表。

行逻辑连接的顺序表

 现在我们讨论稀疏矩阵的相乘,相加,相减。如果预先知道不是稀疏矩阵,则用二维数组相乘法就可以了。如果是,则我们用来存储矩阵的结构称之为行逻辑连接的顺序表,就是加入一个行表来记录稀疏矩阵中每行的非零元素在三元组表中的起始位置。

### 稀疏矩阵压缩存储方法 #### 存储非零元素及其位置 为了有效地减少内存占用并保持操作效率,稀疏矩阵仅保存非零元素以及它们的位置信息。具体来说,对于每一个非零元素 e,记录其所在的行 i 和列 j 形成三元组 `<i, j, e>` 进行存储[^1]。 #### 辅助信息的存储 除了上述的核心数据外,还需要额外维护一些描述整个矩阵特性的参数,比如总行数、总列数和非零项的数量等基本信息,这些辅助信息有助于后续的各种运算处理。 ### 实现方式 #### 使用数组表示法——三元组表 一种常见的做法是采用二维数组来构建所谓的“三元组表”,其中每一行代表一个非零元素对应的三元组 `(row, col, value)` 。这样的表格不仅直观而且便于理解和编程实现[^2]。 ```c typedef struct { int row; int col; int val; } Triple; // 定义一个结构体用于表示稀疏矩阵 typedef struct { Triple data[MAX_SIZE]; // 非零元素的数据集合 int rows; // 行数 int cols; // 列数 int nums; // 非零元素数量 } SparseMatrix; ``` 此段代码定义了一个名为 `SparseMatrix` 的 C 结构体用来封装稀疏矩阵的相关属性及非零元素的信息[^3]。 #### 功能函数设计 针对该种表达形式下的稀疏矩阵,可进一步编写诸如创建、销毁、显示、加减乘除等各种功能模块化的子程序来进行相应的计算任务。特别是当涉及到转置操作时,则可以通过调整原有三元组中的行列索引来完成新矩阵的建立过程[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值