稀疏矩阵【压缩算法】,具体代码没有,只是思想
2012-07-20 14:33
375 查看
/*** 稀疏矩阵的知识,比较重要的是压缩存储!* 定义: 假设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都是顺序结构,不适合结构的改变.(插入,删除,移动不方便),所以引出第三种:链式存储】(做矩阵的加法的时候,这个十字链表可以试试)**/
相关文章推荐
- 【代码】稀疏矩阵的压缩存储与转置算法
- 【代码】稀疏矩阵的压缩存储与转置算法
- 【数据结构】稀疏矩阵的压缩存储和转置算法(C++代码)
- sdut 1592转置矩阵【稀疏矩阵的压缩存储】【快速转置算法】
- 各种矩阵压缩原理(书本上没有讲到的具体公式推理过程)
- 各种矩阵压缩原理(书本上没有讲到的具体公式推理过程)
- KMP算法代码实现和优化(不太能理解具体的过程和该算法思想)
- 稀疏矩阵的压缩存储及转置算法
- 【算法】三项式数据结构压缩稀疏矩阵
- 稀疏矩阵的接压缩算法的实现
- 【数据结构与算法】数组应用3:稀疏矩阵压缩(Java实现)
- zookeeper应用——集中配置管理系统的实现(只是设计,没有具体实现代码)
- 稀疏矩阵的压缩存储及转置,快速转置法,C++代码实现
- C语言字符串库函数的实现也是笔试题常考的题目,以下代码没有严格测试,只是简单的实现:
- 经典内部排序算法学习总结(算法思想、可视化、Java代码实现、改进、复杂度分析、稳定性分析)
- 基于矩阵分解推荐算法之交替最小二乘法(ALS)--附实现代码
- VC6.0导出内容到excel的简单代码例子,具体方法没有记录
- (13)稀疏矩阵的压缩-三元组表(转置)
- 3.3.3.3稀疏矩阵转置算法
- 矩阵(稀疏矩阵)的压缩存储(二)