您的位置:首页 > 编程语言 > Java开发

三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)

2014-10-12 20:59 706 查看

三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)

用经典矩阵转置算法和普通的三元组矩阵转置在时间复杂度上都是不乐观的。快速转置算法在增加适当存储空间后实现快速转置具体原理见代码注释部分,时间复杂度为O(nu+tu);个人认为重排三元组之间的次序一步可以省略,虽然三元组数据变得杂乱无章,但是可以把时间复杂度提高到O(tu),如果是不考虑三元组,直接输出转置后的矩阵就可以采用这种方法;行逻辑链接实现稀疏矩阵相乘,十字链表实现稀疏矩阵相加正在编写中,即将更新。声明:转载,引用请以链接形式指明出处。

三元组类Triple.java

package稀疏矩阵的运算;

publicclassTriple<T>{
introw,col;
Tv;
publicTriple(){}
publicTriple(introw,intcol,Tv){
this.row=row;
this.col=col;
this.v=v;
}
}

稀疏矩阵类Mat.java[/code]
package稀疏矩阵的运算;

publicclassMat{
finalintMAXSIZE=10;
intmu,nu,tu;
Triple<Integer>data[]=newTriple[MAXSIZE+1];//Java不支持泛型数组
publicMat(intmu,intnu,inttu){
this.mu=mu;
this.nu=nu;
this.tu=tu;
for(inti=1;i<=MAXSIZE;i++)
data[i]=newTriple();
}
publicvoiddisplay(){
inti,j,k,m,n,count=0;
for(i=1;i<=mu;i++){
for(j=1;j<=nu;j++){
for(k=1;k<=tu;k++){
if(i==data[k].row&&j==data[k].col){
System.out.print(data[k].v+"");
count=-1;
break;
}
}
if(count!=-1)
System.out.print("0");
count=0;
}
System.out.println();
}
}
}

[/code]
快速转置Transfer.java

package稀疏矩阵的运算;
importjava.util.*;

publicclassTransfer{

publicstaticvoidmain(String[]args){
inti,j,k,l;
Scannerscan=newScanner(System.in);
System.out.println("请输入矩阵的行数,列数,非零元的个数:");
intmu,nu,tu;
mu=scan.nextInt();
nu=scan.nextInt();
tu=scan.nextInt();
MatM1=newMat(mu,nu,tu);
MatM2=newMat(nu,mu,tu);
System.out.println("请输入矩阵的三元组:");
for(i=1;i<=tu;i++){
M1.data[i].row=scan.nextInt();
M1.data[i].col=scan.nextInt();
M1.data[i].v=scan.nextInt();
}
System.out.println("您输入的矩阵为:");
M1.display();
//增加两个向量
intnum[]=newint[nu+1];//M1中第col列中非零元的个数
intcol,row,t;
for(col=1;col<=nu;col++){
num[col]=0;
}
for(t=1;t<=tu;t++){
num[M1.data[t].col]++;
}
intcpot[]=newint[nu+1];//M1中第col列的第一个非零元在M2.data中的位置。
cpot[1]=1;
for(col=2;col<=nu;col++){
cpot[col]=cpot[col-1]+num[col-1];
}
intp,q;//实现转置
for(p=1;p<=tu;p++){
col=M1.data[p].col;
q=cpot[col];
M2.data[q].row=M1.data[p].col;
M2.data[q].col=M1.data[p].row;
M2.data[q].v=M1.data[p].v;
cpot[col]++;
}
System.out.println("转置后的矩阵为:");
M2.display();

}

}

[/code]

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: