zoukankan      html  css  js  c++  java
  • 稀疏矩阵的压缩存储方法

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

    假设 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)

  • 相关阅读:
    Ubuntu创建VLAN接口配置
    Ubuntu配置网桥方法
    Ubuntu重启网卡的三种方法
    kvm存储池和存储卷
    ubuntu如何切换到root用户
    修改Ubuntu默认apt下载源
    Java之泛型<T> T与T的用法(转载)
    Java关键字(一)——instanceof(转载)-BeanCopier相关
    java代码之美(12)---CollectionUtils工具类(转载)
    Lombok-注解@Slf4j的使用
  • 原文地址:https://www.cnblogs.com/vincentqliu/p/sparse_matrix.html
Copyright © 2011-2022 走看看