三元組順序結構實現稀疏矩陣相加,行序優先(Java語言描述)
阿新 • • 發佈:2019-01-02
不用十字連結串列也可以稀疏矩陣相加時間複雜度最壞情況達到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++; } } } }