三元组顺序结构实现稀疏矩阵相加,行序优先(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++; } } } }
作者:Pickle
声明:对于转载分享我是没有意见的,出于对博客园社区和作者的尊重一定要保留原文地址哈。
致读者:坚持写博客不容易,写高质量博客更难,我也在不断的学习和进步,希望和所有同路人一道用技术来改变生活。觉得有点用就点个赞哈。