稀疏矩阵的压缩存储与快速转置

       在m*n的矩阵中,非零元素个数为t,∂=t/(m*n),称∂为矩阵的稀疏因子,当∂<=0.05称矩阵为稀疏矩阵。为了节省空间,可以用三元组来存储稀疏矩阵。三元组记录矩阵非零值的行、列、值。

       在求矩阵的转置矩阵时,可以用快速转置方法来节省时间。

     

#include<bits/stdc++.h>
#include<iostream>
#include<cctype>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
using namespace std;
typedef unsigned long long ull;
typedef  long long ll;
typedef pair<ll,ll> pi;
#define IOS std::ios::sync_with_stdio(false)
#define ls p<<1
#define rs p<<1|1
#define mod 1000000007
#define PI acos(-1.0)
#define INF   1e18
#define eps 1e-8
#define N 2000 + 5
/*********************Code*********************/
ll num[N],cpot[N];
struct Node{
    ll i,j,e;
};
struct node{
    Node d[N];
    ll m,n,t;
};
void solve(node M,node &T){
    T.m = M.m;
    T.n = M.n;
    T.t = M.t;
    if(T.t){
        for(ll t = 1;t<=M.t;t++)
            num[M.d[i].j]++;
        cpot[1] = 1;
        for(ll col = 2;col<=M.n;i++)
            cpot[col] = cpot[col-1]+num[col-1];
        for(ll p = 1;p <=M.t;p++){
            ll col =M.d[p].j;
            ll q =cpot[col];
            T.d[q].i = M.d[p].j;
            T.d[q].j = M.d[p].i;
            T.d[q].e = M.d[p].e;
            cpot[col]++;
        }
    }
}
int main(void){
    node M,T;
    cin>>M.m>>M.n;
    M.t = 0;
    for(ll i = 0;;i++){
            ll x,y,z;
        cin>>x>>y>>z;
       if(!x&&!y&&!z)
        break;
       M.d[i].i = x,M.d[i].j = y,M.d[i].e = z;
       M.t++;
    }
    solve(M,T);
    for(ll i = 0;i<T.t;i++){
        cout<<T.d[i].i<<" "<<T.d[i].j<<" "<<T.d[i].e<<endl;
    }
    return 0;
}
/*
10 10
1 2 12
1 3 9
3 1 -3
3 6 14
4 3 24
5 2 18
6 1 15
6 4 -7
0 0 0
*/

 

posted @ 2021-04-13 09:24  阿涅—Rachel  阅读(304)  评论(0)    收藏  举报