【数据结构】特殊矩阵的压缩存储2——稀疏矩阵
来源:互联网 发布:输电网络 编辑:程序博客网 时间:2024/06/07 17:34
为了节省存储空间并且加快处理速度,需要对这类矩阵进行压缩存储,压缩存储的原则是:不重复存储相同元素;不存储零值元素。
一、相关概念
㈠特殊矩阵:矩阵中存在大多数值相同的元,或非0元,且在矩阵中的分布有一定规律。
⒈对称矩阵:矩阵中的元素满足
aij=aji 1≤i,j≤n
⒉三角矩阵:上(下)三角矩阵指矩阵的下(上)三角(不包括对角线)中的元素均为常数c或0的n阶矩阵。
⒊对角矩阵(带状矩阵):矩阵中所有非0元素集中在主对角线为中心的区域中。
㈡稀疏矩阵:非0元素很少(≤ 5%)且分布无规律。
二、存储结构及算法思想
1、对称矩阵
存储分配策略: 每一对对称元只分配一个存储单元,即只存储下三角(包括对角线)的元, 所需空间数为: n(n+1)/2。
存储分配方法: 用一维数组sa[n(n+1)/2]作为存储结构。
sa[k]与aij之间的对应关系为:
2、三角矩阵
也是一个n阶方阵,有上三角和下三角矩阵。下(上)三角矩阵是主对角线以上(下)元素均为零的n阶矩阵。设以一维数组sb[0..n(n+1)/2]作为n阶三角矩阵B的存储结构,仍采用按行存储方案,则B中任一元素bi,j和sb[k]之间仍然有如上的对应关系,只是还需要再加一个存储常数c的存储空间即可。如在下三角矩阵中,用n(n+1)/2的位置来存储常数。
对特殊矩阵的压缩存储实质上就是将二维矩阵中的部分元素按照某种方案排列到一维数组中,不同的排列方案也就对应不同的存储方案
2、稀疏矩阵
常见的有三元组表示法、带辅助行向量的二元组表示法(也即行逻辑链表的顺序表),十字链表表示法等。
1)、三元组表示法
三元组表示法就是在存储非零元的同时,存储该元素所对应的行下标和列下标。稀疏矩阵中的每一个非零元素由一个三元组(i,j,aij)唯一确定。矩阵中所有非零元素存放在由三元组组成的数组中。
在此,da
以下看如何利用三元组表示法来实现矩阵的转置。
(1)按照b.da
2)、带辅助行向量的二元组表示法及十字链表表示法在下一节中学习介绍。
三、存储结构及C语言描述
1、三元组表示法
(1)按照b矩阵中的行次序依次在a.da
(2)快速转置:按照a.da
恰当位置的确定:首先计算M矩阵的每一列(即T的每一行)中非0元的个数,然后求得M矩阵每一列第一个非0元在b.da
算法基本思想:
设置两个向量:
num[col]:第col列的非零元素个数。
cpot[col]:第col列第一个非零元在b.da
在转置过程中,指示该列下一个非零元在b.da
1、num[col]的计算:
顺序扫描a.da
2、cpot[col]计算:
2)、带辅助行向量的二元组表示法及十字链表表示法在下一节中学习介绍。
四、算法的C语言实现
#include "stdio.h"#include "stdlib.h"#define MAXSIZE 12500#define OK 1typedef int ElemType;typedef struct{int i, j;ElemType e;}Triple;typedef struct{Triple data[MAXSIZE + 1];int mu, nu, tu; //矩阵行数,列数和非0元个数}TSMatrix;int cpot[MAXSIZE + 1], num[MAXSIZE + 1];int TransposeSMatrix(TSMatrix M, TSMatrix &T){T.mu = M.nu;T.nu = M.mu;T.tu = M.tu;if (T.tu){int q = 1;for (int col = 1; col <= M.nu; ++col)for (int p = 1; p <= M.tu; ++p)if (M.data[p].j == col){T.data[q].i = M.data[p].j;T.data[q].j = M.data[p].i;T.data[q].e = M.data[p].e;++q;}//if}//ifreturn OK;}//TransposeSMatrixint InPutM(TSMatrix &M){printf("input nu mu tu(With a space interval)of a Matrix:\n");scanf("%d %d %d", &M.nu, &M.mu, &M.tu); //row,colume,and tuprintf("Please input the data of Matrix:\n");for (int c = 1; c <= M.tu; c++){scanf("%d", &M.data[c].i);scanf("%d", &M.data[c].j);scanf("%d", &M.data[c].e);}//forreturn 1;}//InPutint PrintM(TSMatrix T){printf("Matrix after transpose is:\n");for (int c = 1; c <= T.tu; c++){printf("%d %d %d\n", T.data[c].i, T.data[c].j, T.data[c].e);}//forreturn 1;}//InPutint FastTransposeSMatrix(TSMatrix M, TSMatrix &T){T.mu = M.nu;T.nu = M.mu;T.tu = M.tu;if (T.tu){for (int col = 1; col <= M.mu; ++col) num[col] = 0;for (int t = 1; t <= M.tu; ++t) ++num[M.data[t].j]; //记述M.data[t].j列//非0元的个数cpot[1] = 1;//求第col列中第一个非零元在b.data(T)中的序号for (int col = 2; col <= M.mu; ++col)cpot[col] = cpot[col - 1] + num[col - 1];for (int p = 1; p <= M.tu; ++p){int col = M.data[p].j;int q = cpot[col];T.data[q].i = M.data[p].j;T.data[q].j = M.data[p].i;T.data[q].e = M.data[p].e;++cpot[col];}//for}//ifreturn OK;}//FastTransposeSMatrixint main(){TSMatrix M, T;InPutM(M);//TransposeSMatrix(M,T);FastTransposeSMatrix(M, T);PrintM(T);return OK;}
- 【数据结构】特殊矩阵的压缩存储2——稀疏矩阵
- 数据结构——稀疏矩阵的压缩存储
- 数据结构——特殊矩阵的压缩存储
- 数据结构进阶(二)矩阵(稀疏矩阵)的压缩存储
- 【数据结构】对称矩阵和稀疏矩阵的压缩存储
- 【数据结构】特殊矩阵的压缩存储1——对称矩阵
- 稀疏矩阵的压缩存储
- 稀疏矩阵的压缩存储
- 稀疏矩阵的压缩存储
- 稀疏矩阵的压缩存储
- 稀疏矩阵的压缩存储
- 稀疏矩阵的压缩存储
- 稀疏矩阵的压缩存储
- 稀疏矩阵的压缩存储
- 数据结构:矩阵的压缩存储(特殊矩阵)
- 矩阵(稀疏矩阵)的压缩存储
- 对称矩阵、稀疏矩阵的压缩存储
- 数据结构学习笔记--稀疏矩阵的压缩存储
- 【数据结构】特殊矩阵的压缩存储1——对称矩阵
- spring 4++学习笔记(3一 5.9)
- Gradle与Gradle插件版本适配和离线Gradle遇到的问题
- c#——Enum之Json序列化
- java 一维数组求最大数最小数
- 【数据结构】特殊矩阵的压缩存储2——稀疏矩阵
- java中的除法和取于注意点
- jupyter
- Oracle VM VirtualBox虚拟MS-DOS时失败,提示内存不能为“written”
- 解决orcale中nvarchar与varchar的数据类型转换问题
- java 各型默认值
- 1.7.7停止线程(stop停止造成数据不同步)
- java 百元百鸡 分数的输入
- 实验一