稀疏矩阵的定义:
稀疏矩阵的概念:
首先矩阵的概念就不说了,都知道,那么稀疏矩阵就是矩阵中的特殊情况,其非零元素的个数远远小于零元素的个数。在实际应用中稀疏矩阵一般比较大,非零元素所占的的比例都比较小。
稀疏矩阵的三元组线性表示:
由于如果使用二位数组来存储的话就要浪费很多存储空间,同时还要在运算中花费大量的时间来进行零元素的无效计算。所以好的方法就是存储站元素中极少数的非零元素。所以就出现了三元组的形式来存储元素。分别表示行号,列号 和元素的值(i,j,aij)若把所有的三元组按照行号为主序(主关键字)。列号为辅序(次关键字),当行号相同时在考虑列号次序进行排序,就构成稀疏矩阵的三元组线性表。
例如下面矩阵
1 2 3 4 5 6
1 3 0 0 5 0 0
2 0 0 -2 0 0 0
3 1 0 4 0 6 0
4 0 0 0 0 0 0
5 0 0 -1 0 0 0
//稀疏矩阵线性表如下
//((1,1,3),(1,4,5),(2,3,-2),(3,1,1),(3,3,4),(3,5,6),(5,3,-1))
稀疏矩阵的存储结构:
1.顺序存储:这里有两个结构体:
struct Triple{
int row,col;//存储行号和列号
ElemType val;//存储元素值
};
struct SMatrix{
int m,n,t;//记录稀疏矩阵的行数,列数和非零元素的个数
Triple sm[MaxTerma+1];//顺序存储每个三元组函数
};
2.链接存储(这个比较不好理解)稀疏矩阵的链接存储就是对其相应的三元组线性表进行链接存储。
(1):带行指针向量的链接存储。在这种链接存储中,需要把具有相同行号的三元组节点按照列号从小到大的顺序链接成一个单链表。
struct TripleNode{
int row,col;//存储行号和列号
ElemType val;//存储元素值
TripleNode* next;//指向同一行的下一个结点。
};
struct LMatrix{
int,m,n,t;//保存稀疏矩阵的 行数列数,和非零元素个数,
TripleNode* vector[MaxRows+1];//保存稀疏矩阵所对应的m个行单链表的表头指针
};
(2)十字链接存储:是既带行指针向量又带列指针向量的存储结构。
struct CrossNode{
int row,col;
ElemType val;
CrossNode *down,*right;//down域用来存储指向同一列下一个结点的指针
//right域用来指向同一行下一个结点的指针
};
struct CLMatrix{
int m,n,t;
CrossNode* rv[MaxRows+1];
CrossNode* cv[MaxColumns+1];
};
在复习数据结构,数据结构需要好好地认真的理解,不要学的不扎实。