稀疏矩阵【压缩算法】,具体代码没有,只是思想

来源:互联网 发布:win10重启后软件消失 编辑:程序博客网 时间:2024/05/29 15:46
/*** 稀疏矩阵的知识,比较重要的是压缩存储!* 定义: 假设m行n列的矩阵中,只有t个非零元素,则成 t/(m*n)为稀疏因子,当稀疏因子<=0.05的时候称为稀疏矩阵* 产生的问题: 大约95%的元素都是0,占用的空间很大,计算的时候也和这些0做了很多运算(+,-,*,/),而/法还不能除0,所以特别麻烦* * 压缩存储:* (1)特殊矩阵(三角矩阵,对角矩阵)的压缩存储比较简单* (2)随机稀疏矩阵的压缩存储:     1.三元组顺序表   元素类型:(行号,列号,元素值)   稀疏矩阵类型:(一个数组,行数,列数,非零元个数)  //改进后的类型是里面还存在一个记录每一行首非零元出现的位置的   Const MaxSize = 1000;   typedef struct   {int i;int j;ElemType e;   }Triple;//元素类型   typedef union   {Triple data[MaxSize + 1];int mu;int nu;int tu;   }TSMatrix;//稀疏矩阵类型   求转置的话:要考虑转过了之后要放到指定的位置【按行从小到大排,所以要做一点操作】   int FastTransposeSMatrix(TSMatrix M, TSMatrix & T)   {    T.mu = M.nu;//转置的行和列 等于 原来的矩阵的 列和行T.nu = M.mu;T.tu = M.tu;//非零元个数是相等的if (T.tu){for (col=1; col<=M.nu; ++col){num[col] = 0;//这个是初始化的for循环 -> 要计算转置后每行的非零元个数}for (t=1; t<=M.tu; ++)  //要计算转置后每行的非零元个数,就是计算原来未转置前的 列[转过来之后,原来的列就成了行了] 的非零元个数{++num[M.data[t].j];}//下面为求转置矩阵每一行第一个非零元在data数组中的位置,也就是求原来的每一列的第一个非零元的位置cpot[1] = 1;//第一行的起始位置是1for (col=2; col<=M.nu; ++col)//求每一行的第一个非零元的位置, 之后转置在某行插入一个元素之后,对应的行的cpot要+1{cpot[col] = cpot[col-1] + num[col-1]; //第col行的元素的起始位置为  col-1行的起始位置 + col-1行的非零元个数}for (p=1; p<=M.tu; ++p){//转置矩阵元素, 然后根据cpot放到相应的位置}}   }   2.三元组顺序存储改进【和方法1差别在于有存储每一行非零元的个数】(常用) -- 代码不详      3.十字链表   【方法1和方法2都是顺序结构,不适合结构的改变.(插入,删除,移动不方便),所以引出第三种:链式存储】   (做矩阵的加法的时候,这个十字链表可以试试)**/