1. 程式人生 > >三元組順序結構實現稀疏矩陣相加,行序優先(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++;
			}
		}
	}

}