稀疏矩阵转置

用C语言或C++给出稀疏矩阵三元组存储结构的定义,并写出矩阵转置的算法。

#define SIZE 10
typedef struct node{  //三元组单元
    int i;
    int j;
    int data;
}node;

typedef struct{
    node ARRAY[SIZE];
    int x,y,n;   //行,列,个数
}THREE;

第一种方法:直接转置,O(n*y)


void invert(THREE *t, THREE *M){
    int first = 0;
    M->y = t->x;
    M->x = t->y;
    M->n = t->n;
    for(int p=1; p<=t->y; p++){
        for(int q=0; q<t->n; q++){
            if(t->ARRAY[q].j == p){
                M->ARRAY[first].i = t->ARRAY[q].j;
                M->ARRAY[first].j = t->ARRAY[q].i;
                M->ARRAY[first].data = t->ARRAY[q].data;
                first++;
            }
        }
    }
}

方法二:利用两个数组,O(n+y)

void invert(THREE *t, THREE *M){
    M->y = t->x;
    M->x = t->y;
    M->n = t->n;
    int cols[t->y+1],start_pos[t->y+1];
    for(int q=1;q<t->y+1;q++){
        cols[q] = 0;
        start_pos[q] = 0;
    }
    for(int p=1; p<=t->n; p++){  //统计每一列的个数
        cols[t->ARRAY[p].j]++;
    }

    start_pos[1] = 1;
    for(int p=2; p<=t->y; p++){   //计算出每一个列的开始位置
        start_pos[p] = start_pos[p-1] + cols[p-1];
    }

    for(int p=1; p<=t->n; p++){
        M->ARRAY[start_pos[t->ARRAY[p].j]].j = t->ARRAY[p].i;
        M->ARRAY[start_pos[t->ARRAY[p].j]].i = t->ARRAY[p].j;
        M->ARRAY[start_pos[t->ARRAY[p].j]].data = t->ARRAY[p].data;
        start_pos[t->ARRAY[p].j]++;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值