数据结构·稀疏数组·矩阵转置

1.稀疏矩阵的存储

三元组

非零元的值,其所在的行号,列号(value,row,col)

注:三元组中的元素一定是有序排列的,且按照行优先的形式

三元组表(sequential list of triple)

typedef struct
{
int i,j;//行号和列号
elemtype elem;//元素值
}triple;

typedef struct
{
triple data[MAXSIZE];
int mu,nu,tu;//原矩阵的行数,列数和非零元个数
}TSMatrix;

2.矩阵的转置

原矩阵:

转置后矩阵:

三元表储存形式:(转置后仍要行列有序!

  

​
​
ststus transposeSMatrix(TSMatrix M,TSMatrix *T)
{
int p,q,col;
T->mu=M.nu;//T行对M列
T->nu=M.mu;//T列对M行
T->tu=M.tu;//第一个非零值
if(T->tu)//矩阵至少含有一个非零元素
{
q=0;//
for(col=0;col<M.nu;++col)//对原矩阵列遍历,保证了转置后的行有序
 {
for(p=0;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].elem=M.data[p].elem;//交换元素对应的数据
  ++q;
  }
 }
 }
}

​

​

 缺点是时间复杂度太高

算法:快速转置(fast transpotation)

设num[ ]和cpot[ ]分别用来存放每一列的非零元素的个数和该列第一个非零元在转置后矩阵T中的位置。则有:

cpot[0]=0;

cpot[col]=cpot[col-1]+num[col-1]

每一列的非零元素可以通过对整个矩阵M扫描一遍得到。

status fasttranspose(TSMatrix M,TSMatrix *T)
{
int col,p,q,t;
T->mu=M.nu;
T->nu=M.mu;
T->tu=M.tu;//将矩阵的行列非零元等信息传给T,使其初始化
if(T->tu)
{
for(col=0;col<M.nu;++col)num[col]=0;//初始化数组
for(t=0;t<M.tu;++t)//统计每列非零元的个数
++num[M.data[t].j];
cpot[0]=0;//计算每列第一个非零元转置后的位置
for(col=1;col<M.nu;++col)
 {
cpot[col]=cpot[col-1]+num[col-1];//算式
for(p=0;p<=M.tu;++p)
  {
col=M.data[p].j;
q=cpot[col];
T->data[q].i=M.data[p].j;
T->data[q].j=M.data[p].i;
T->data[q].elem=M.data[p].elem;
++cpot[col];
  }
 }
}

q:该元素对应列出现首个非零元素在转置中对应的数组元素序号

++cpot[col]若有,对应同一列的下一个非零元素

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值