稀疏矩阵:非零元多,在矩阵中随机出现
假设 m 行 n 列的矩阵含 t 个非零元素,则称
δ=t/(m*n)
为稀疏因子。 通常认为 δ<= 0.05 的矩阵为稀疏矩阵。
常规存储方法缺点:
1) 零值元素占了很大空间;
2) 计算中进行了很多和零值的运算,遇除法, 还需判别除数是否为零。
稀疏矩阵的压缩存储方法:
一 、三元组顺序表
二、行逻辑联接的顺序表
三、 十字链表
一 、三元组顺序表
•采用一维数组以行为主序存放每一非零元;
•每一非零元只存行号、列号、非零元的值;
如何求转置矩阵?
- 根据三元组顺序表的特点, 首先扫描一遍三元素,将扫 描到的列号为1的非0元行列 交换存放于转置后的新阵, 生成新阵第一行的非0元;
- 再扫描一遍三元素,将扫描 到的列号为2的非0元行列交 换存放于转置后的新阵,生 成新阵第二行的非0元;
- ……
方法1:将矩阵M转置成矩阵T
方法2:减少原阵的扫描次数,提高时间效率
- Num[col]:存放矩阵T中每一行非零元的个数
- Cpot[col]:存放矩阵T中每一行非零元的当前存放的位置
所谓“位置” ,即在三元组中存放的数组 元素的下标
cpot[1] = 1;
for (col=2; col<=M.nu; ++col)
cpot[col] = cpot[col-1] + num[col-1];
1 #define ElemType int 2 #define MAXSIZE 12500 3 typedef struct{ 4 int j,i; //该非零元的行下标和列下标 5 ElemType e; // 该非零元的值 6 7 }Triple; // 三元组类型 8 9 typedef struct{ 10 Triple data[MAXSIZE+1]; 11 int mu,nu,tu; 12 13 }TSMatrix; // 稀疏矩阵类型 14 15 //方法1:将矩阵M转置成矩阵T 16 status TranspostSMatrix(TSMatrix M,TSmatrix $T){ 17 T.mu=M.nu; 18 T.nu=M.mu; 19 T.tu=M.tu; 20 if(T.tu){ 21 q=1; 22 //M.data[p]是在第一个元素开始存的M.data[0]空出来 23 for(col=1;col<=M.nu;++col) 24 for(p=1;p<=M.tu;++p){ 25 if(M.data[p].j==col){ 26 T.data[q].i=M.data[p].j; 27 T.data[q].j=M.data[p]=i; 28 T.data[q].e=M.data[p].e; 29 q++; 30 } 31 } 32 33 } 34 return 0; 35 } 36 37 38 //方法2:减少原阵的扫描次数,提高时间效率 39 status FastTransposeSMatrix(TSMtrix M,TSMatrix &T){ 40 T.mu=M.nu; 41 T.nu=M.mu; 42 T.tu=M.tu; 43 if(T.tu){ 44 for(col=1;col<=M.nu;++col) 45 num[col]=0; 46 for(t=1;t<=M.tu;++t) 47 ++num[M.data[t].j]; 48 49 cpot[1] = 1; 50 for (col=2; col<=M.nu; ++col) 51 cpot[col] = cpot[col-1] + num[col-1]; 52 //减少原阵的扫描次数,提高时间效率 53 for(p=1;p<=M.tu;++p){ 54 col=M.data[p].j; 55 q=cpot[col]; 56 T.data[q].i=M.data[p].j; 57 T.data[q].j = M.data[p].i; 58 T.data[q].e = M.data[p].e; 59 ++cpot[col] 60 } 61 } 62 return o; 63 }
方法一:时间复杂度为: O(M.nu*M.tu)
方法二:时间复杂度为: O(M.nu+M.tu)