zoukankan      html  css  js  c++  java
  • 三元组顺序结构实现稀疏矩阵相加,行序优先(Java语言描述)

    不用十字链表也可以稀疏矩阵相加时间复杂度最坏情况达到O(tuA + tuB);思路比较简单就不赘述了,代码如下:

    三元组:

    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;
    	}	
    }
    
    


     

    构建矩阵存储结构:

    package 行逻辑链接的顺序表实现稀疏矩阵的相乘;
    
    public class Mat {
    	final int MAXSIZE = 10;
    	int mu,nu,tu;
    	int rpos[] = new int[MAXSIZE + 1];//各行第一个非零元的位置表
    	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();
    		}
    	}
    }
    

    相加:

    package 行逻辑链接的顺序表实现稀疏矩阵的相乘;
    
    import java.util.*;
    
    public class AddMat {
    
    	public static void main(String[] args) {
    	/*
    	 * @author 王旭
    	 * @time 2014/10/14/23:50
    	 * 
    	 */
    		Scanner scan =  new Scanner(System.in);
    		int muA,nuA,tuA,muB,nuB,tuB;
    		System.out.println("请输入A矩阵的行,列,非零元的个数:");
    		muA = scan.nextInt();
    		nuA = scan.nextInt();
    		tuA = scan.nextInt();
    		Mat A = new Mat(muA,nuA,tuA);
    		System.out.println("请输入A矩阵的三元组:");
    		for(int i=1; i<=tuA; i++){
    			A.data[i].row = scan.nextInt();
    			A.data[i].col = scan.nextInt();
    			A.data[i].v = scan.nextInt();
    		}
    		System.out.println("A矩阵为:");
    		A.display();
    		System.out.println("请输入B矩阵的行,列,非零元的个数:");
    		muB = scan.nextInt();
    		nuB = scan.nextInt();
    		tuB = scan.nextInt();
    		Mat B = new Mat(muB,nuB,tuB);
    		System.out.println("请输入B矩阵的三元组:");
    		for(int i=1; i<=tuB; i++){
    			B.data[i].row = scan.nextInt();
    			B.data[i].col = scan.nextInt();
    			B.data[i].v = scan.nextInt();
    		}
    		System.out.println("B矩阵为:");
    		B.display();
    		Mat C = new Mat(muA,nuA,1);
    		add(A,B,C);
    		System.out.println("相加后的矩阵C为:");
    		C.display();
    
    	}
    	public static void add(Mat A, Mat B, Mat C){
    		int k,l,temp;
    		//C = new Mat(A.mu,A.nu,1);
    		k = 1;
    		l = 1;
    		while(k<A.tu && l<B.tu){
    			if((A.data[k].row == B.data[l].row) && (A.data[k].col == B.data[l].col)){
    				temp = A.data[k].v + B.data[l].v;
    				if(temp != 0){
    					C.data[C.tu].row = A.data[k].row;
    					C.data[C.tu].col = A.data[k].col;
    					C.data[C.tu].v = temp;
    					C.tu++;
    				}
    				k++;
    				l++;
    			}
    			if(( (A.data[k].row == B.data[l].row) && (A.data[k].col < B.data[l].col) ) || (A.data[k].row<B.data[l].row)){
    				C.data[C.tu].row = A.data[k].row;
    				C.data[C.tu].col = A.data[k].col;
    				C.data[C.tu].v = A.data[k].v;
    				C.tu++;
    				k++;
    			}
    			if(( (B.data[l].row == A.data[k].row) && (B.data[l].col < A.data[k].col) ) || (B.data[l].row<A.data[k].row)){
    				C.data[C.tu].row = B.data[l].row;
    				C.data[C.tu].col = B.data[l].col;
    				C.data[C.tu].v = B.data[l].v;
    				C.tu++;
    				l++;
    			}
    		}
    	}
    
    }
    


     


     

  • 相关阅读:
    JavaScript操作DOM对象
    QTP(13)
    QTP(12)
    QTP(11)
    QTP(10)
    QTP(9)
    QTP(8)
    QTP(7)
    QTP(6)
    QTP(5)
  • 原文地址:https://www.cnblogs.com/wxisme/p/4363780.html
Copyright © 2011-2022 走看看