zoukankan      html  css  js  c++  java
  • 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)

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

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

    稀疏矩阵类Mat.java
    package 稀疏矩阵的运算;
    
    public class Mat {
    	final int MAXSIZE = 10;
    	int mu,nu,tu;
    	Triple<Integer> data[] = new Triple[MAXSIZE + 1];//Java不支持泛型数组
    	public Mat(int mu,int nu,int tu){
    		this.mu = mu;
    		this.nu = nu;
    		this.tu = tu;
    		for(int i=1; i<=MAXSIZE; i++)
    			data[i] = new Triple();
    	}
    	public void display(){
    		int i,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();
    		}
    	}
    }
    

    快速转置Transfer.java
    package 稀疏矩阵的运算;
    import java.util.*;
    
    public class Transfer {
    
    	public static void main(String[] args) {
    		int i,j,k,l;
    		Scanner scan = new Scanner(System.in);
    		System.out.println("请输入矩阵的行数,列数,非零元的个数:");
    		int mu,nu,tu;
    		mu = scan.nextInt();
    		nu = scan.nextInt();
    		tu = scan.nextInt();
    		Mat M1 = new Mat(mu,nu,tu);
    		Mat M2 = new Mat(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();
    		//增加两个向量
    		int num[] = new int[nu+1];//M1中第col列中非零元的个数
    		int col,row,t;
    		for(col=1; col<=nu; col++){
    			num[col] = 0;
    		}
    		for(t=1; t<=tu; t++){
    			num[M1.data[t].col]++;
    		}
    		int cpot[] = new int[nu+1];//M1中第col列的第一个非零元在M2.data中的位置。
    		cpot[1] = 1;
    		for(col=2; col<=nu; col++){
    			cpot[col] = cpot[col - 1] + num[col - 1];
    		}
    		int p,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();
    		
    	}
    	
    }
    

     
  • 相关阅读:
    区块链钱包应用如何开发
    区块链钱包开发什么是区块链钱包
    FileFilter, FilenameFilter用法和文件排序
    买了个空间玩
    MapReduce
    Java学习笔记六:多态
    Java学习笔记五:复用类
    Java学习笔记二:初始化(三)
    Java学习笔记二:初始化(二)
    Java学习笔记四:static关键字
  • 原文地址:https://www.cnblogs.com/wxisme/p/4363790.html
Copyright © 2011-2022 走看看