共计 977 个字符,预计需要花费 3 分钟才能阅读完成。
在科学与工程领域中求解线性模型时经常出现大型的稀疏矩阵。在使用计算机存储和操作稀疏矩阵时,经常需要修改标准算法以利用矩阵的稀疏结构。由于其自身的稀疏特性,通过压缩可以大大节省稀疏矩阵的内存代价。更为重要的是,由于过大的尺寸,标准的算法经常无法操作这些稀疏矩阵。
三元组表示法
按照压缩存储的概念,只存储稀疏矩阵的非零元素。因此,除了存储非零元的值之外,还必须同时记录下它所在的行和列的位置(i,j)。反之,一个三元组(i,j,aij) 唯一确定了矩阵A的一个非零元素。由此,稀疏矩阵可以用表示非零元的三元组及其行列数和非零元的个数唯一确定。例如,下面三元组表:
((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,8))
最后一个三元组(6,7,8),表示系数矩阵为6行7列,包含8个非零元。
十字链表示法
用三元组表法表示的稀疏矩阵,比起用二维数组存储,节约了空间,并且使得矩阵某些运算的运算时间比经典算法还少。但是,在进行矩阵加法、减法和乘法等运算时,有时矩阵中的非零元素的位置和个数会发生很大的变化。如A=A+B,将矩阵B加到矩阵A上,此时,若还用三元组的表示法,势必会为了保持三元组表“以行序为主序”,而大量移动元素。十字链表能够灵活地插入因运算而产生的新的非零元素、删除因运算而产生的新的零元素,实现矩阵的各种运算。
在十字链表中,矩阵的每一个非零元素用一个结点表示,该结点除了(row,col,value)以外,还要有以下两个链域:
- right: 用于链接同一行中的下一个非零元素
- down:用以链接同一列中的下一个非零元素
整个结点的结构如图5.22所示。
在十字链表中,同一行的非零元素通过right域链接成一个单链表。同一列的非零元素通过down域链接成一个单链表。这样,矩阵中任一非零元素Mij所对应的结点既处在第i行的行链表上,又处在第j列的列链表上,这好像是处在一个十字交叉路口上,所以称其为十字链表。同时我们再附设一个存放所有行链表的头指针的的一维数组,和一个存放所有列链表的头指针的的一维数组。
整个十字链表的结构如图5.23所示。