数据结构 稀疏矩阵的压缩方法 待补充
来自 严蔚敏《数据结构》
稀疏矩阵的压缩方法主要有:
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。代表了该非零元的行号、列号以及值。那么在十字链表的存储方式下,首先这三个域是肯定少不了的,不然在进行很多操作的时候都要自己使用计数器,很麻 烦。而十字链表的形式大家可以理解成每一行是一个链表,而每一列又是一个链表。
行逻辑连接的顺序表
现在我们讨论稀疏矩阵的相乘,相加,相减。如果预先知道不是稀疏矩阵,则用二维数组相乘法就可以了。如果是,则我们用来存储矩阵的结构称之为行逻辑连接的顺序表,就是加入一个行表来记录稀疏矩阵中每行的非零元素在三元组表中的起始位置。
上一篇: 物理引擎探究(9)---球碰撞处理
下一篇: 稀疏矩阵与压缩存储
推荐阅读