1.数组
数组是下标与值成对的集合。在C++中有静态与动态之分:(1)静态数组:定义时显式声明数据类型与空间内存大小。(2)动态数组:程序运行时才分配空间的。
数组有两种顺序映像方式:(1)以行序为主序(低下标优先):最右边的下标先变化,从右到左;(2)以列序为主序(高下标优先):最左边的下标先变化,从左到右。
2.矩阵压缩
主要是针对特殊矩阵的压缩:例如:实对称矩阵、三角矩阵和对角矩阵。
(1)实对称矩阵
由于实对称矩阵中矩阵元素,可以节约一半空间,只需要上三角或者下三角元素即可。
(2)三角阵
类似于实对称矩阵。
(3)稀疏矩阵
其压缩方法是只存储非零元素,包括该元素的行标和列标。因此,一个非零元素由三元组才能唯一确定。该线性表构成了稀疏矩阵的三元组顺序表。
当稀疏矩阵个数和位置经过运算变化较大时,就不再适合用顺序结构存储了。应采用下面方法存储:
(1)单向链表表示法
用指针域将三元组元素链接起来。
(2)行链表表示法
矩阵是一个包括行指针的顺序表,行指针链接的是同行每个列的非零元素。首先有一个矩阵类,主要包括行线性表、行序、列序、数字、最大空间,行线性表由当前行序号和行指针组成,行指针指向列元素,包括列序号、值、结点指针。
(3)十字链表表示法
十字链表为矩阵的每一行设置一个单独的循环链表,同时也为每一列设置一个单独的循环链表,这样稀疏矩阵的每一个元素就同时包含在了两个链表中,大大降低了链表长度和时间复杂度。
其中,row.col和val分别代表非零元素所在的行标、列标以及元素值;down和right分别用来链接同列和同行的下一个非零元素节点。也就是说,同列非零元素是通过down指针链接成一个列链表,而 right 指针则把同行非零元素链接成一个行链表。对稀疏矩阵的每个非零元素来说,既是列链表中一个结点,同时也是行链表中一个结点。每个非零元素就好比处于一个十字路口,因此,这种表示稀疏矩阵的存储结构称为十字链表。
十字链表中设置行头结点,列头结点以及链表头结点。它们采用与非零元素结点类似的结构。由于行头结点中只有right指针指向该行第一个非零元素(down为空),列头结点中只有down指针指向该列的第一个非零元素(right 为空)。因此,为了节省空间,行头结点和列头结点可以共用一组头结点,行列头结点数为矩阵行数和列数中的最大值,并且设置row和 col的值均为0,各个头结点之间用next指针域连接。