不用十字链表也可以稀疏矩阵相加时间复杂度最坏情况达到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++;
}
}
} }

三元组顺序结构实现稀疏矩阵相加,行序优先(Java语言描述)的更多相关文章

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

    三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述) 用经典矩阵转置算法和普通的三元组矩阵转置在时间复杂度上都是不乐观的.快速转置算法在增加适当存储空间后实现快速转置具体原理见代码注释部 ...

  2. 行逻辑链接的顺序表实现稀疏矩阵的相乘(Java语言描述)

    行逻辑链接,带行链接信息.程序有空指针BUG,至今未解决.还是C/C++适合描述算法数据结构.以后复杂的算法还是改用C/C++吧. 有BUG的代码,总有一天会换成没有BUG的. package 行逻辑 ...

  3. 【数据结构】之顺序表(Java语言描述)

    之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...

  4. Java流程控制:顺序结构

    一.流程控制 Java中的流程控制语句可以这样分类:顺序结构.选择结构.循环结构.这三种结构就足够解决所有的问题了! 二.顺序结构 描述: Java流程控制的基本结构就是顺序结构,除非特别指明,否则J ...

  5. C语言程序设计第二次作业——顺序结构

    (一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. 错误信息1: 错误原因:i和d位置错误 改正方法:i和d位置互换 错误信息2: 错误原因:\n后缺了一个" 改正方法:\n后加一个 ...

  6. C语言第二次作业——顺序结构

    一.改错题 1.输出带框文字:在屏幕上输出以下3行信息. (1)源程序 对程序进行编译,发现错误信息1 错误原因:stdio拼写错误 改正方法:将stdio正确拼写 对程序进行编译,发现错误信息2 错 ...

  7. C++ 用三元组表示法存储稀疏矩阵

    若有一个矩阵(m*n),其中非0元素个数远少于数值为0的元素个数,若开辟一个m*n大空间,来存储这样一个很多元素值为0的矩阵,浪费空间,于是我们只存储这些非0的元素的下标及数值 用一个结构体——三元组 ...

  8. 12 (H5*) JS第二天 流程控制:顺序结构、分支结构、循环结构

    目录 1:一元运算符 2:流程控制 3:分支之if语句 4:分支之if-else语句 5:分支语句之三元运算符 6:if和else if语句 7:switch-case语句 8:while循环 9:d ...

  9. C#学习笔记11:C#中的顺序结构、分支结构、循环结构

    顺序结构: 代码从Main()函数开始运行,从上到下,一行一行的执行,不漏掉代码. Int a=6; int b=5; int c=a+b; Console.Write(c); 分支结构: 代码有可能 ...

随机推荐

  1. Java EE的十三个技术规范

    Java 是一种非常棒的语言,健壮,跨平台运行,屏蔽了具体的平台环境的要求,也就是说只要支持java 虚拟机,就可以运行java程序. 下面,我们一起学习一下J2EE的十三种技术规范. 一.JDBC: ...

  2. Keystone-all 命令

    本文档介绍Icehouse版keystone-all命令 keystone-all命令在一个进程中同时启动服务和管理API,为openstack提供服务目录,授权和身份认证服务. 用法 $ keyst ...

  3. R语言curve绘图函数

    curve 函数常用于绘制函数对应的曲线,确定函数的表达式,以及对应的需要展示的起始坐标和终止坐标,curve函数就会自动化的绘制在该区间内的函数图像 基本用法,代码示例: curve(sin, -2 ...

  4. 使用Spring.NET的IoC容器

    使用Spring.NET的IoC容器 0. 辅助类库 using System; using System.Collections.Generic; using System.Linq; using ...

  5. 使用 UICollectionView 实现网格化视图效果

    讲解 UICollectionView 的相关链接:http://blog.csdn.net/eqera/article/details/8134986 关键操作: 效果如下: KMCollectio ...

  6. 【百度地图API】制作多途经点的线路导航——路线坐标规划

    一.创建地图 首先要告诉大家的是,API1.2版本取消密钥,取消服务设置,大家可以采用更加简短的方式引用API的JS啦~ <script type="text/javascript&q ...

  7. Tomcat------如何打开配置界面

    如图操作即可:

  8. jdbc数据访问技术

    jdbc数据访问技术 1.JDBC如何做事务处理? Con.setAutoCommit(false) Con.commit(); Con.rollback(); 2.写出几个在Jdbc中常用的接口 p ...

  9. 7 -- Spring的基本用法 -- 6... Spring 3.0 提供的Java配置管理

    7.6 Spring 3.0 提供的Java配置管理 Spring 允许使用Java类进行配置管理,可以不使用XML来管理Bean,以及Bean之间的依赖关系. Interface :Person p ...

  10. Express框架中如何引用ejs模板引擎

    1.如何在项目中安装ejs模板引擎 在NodeJS指南中利用利用以下命令建立网站的基本结构: express -t ejs microblog 运行这个命令后继续运行 cd microblog &am ...