稀疏矩阵的压缩存储方法

稀疏矩阵:非零元多,在矩阵中随机出现

假设 m 行 n 列的矩阵含 t 个非零元素,则称

δ=t/(m*n)

为稀疏因子。 通常认为 δ<= 0.05 的矩阵为稀疏矩阵。

常规存储方法缺点:

  1) 零值元素占了很大空间;

  2) 计算中进行了很多和零值的运算,遇除法, 还需判别除数是否为零。

 

稀疏矩阵的压缩存储方法:

一 、三元组顺序表

二、行逻辑联接的顺序表

三、 十字链表

 

一 、三元组顺序表

•采用一维数组以行为主序存放每一非零元;

•每一非零元只存行号、列号、非零元的值;

如何求转置矩阵?

  1. 根据三元组顺序表的特点, 首先扫描一遍三元素,将扫 描到的列号为1的非0元行列 交换存放于转置后的新阵, 生成新阵第一行的非0元;
  2. 再扫描一遍三元素,将扫描 到的列号为2的非0元行列交 换存放于转置后的新阵,生 成新阵第二行的非0元;
  3. ……   

方法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)

 

posted @ 2017-03-20 17:52  琦在江湖飘  阅读(6190)  评论(0编辑  收藏  举报