不用十字链表也可以稀疏矩阵相加时间复杂度最坏情况达到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. CI框架 -- URI 路由

    一般情况下,一个 URL 字符串和它对应的控制器中类和方法是一一对应的关系. URL 中的每一段通常遵循下面的规则:example.com/class/function/id/ 但是有时候,你可能想改 ...

  2. Eclipse的实用插件

    Decompiler PyDev ShellEd AnyEdit SonarLint PropertiesEditor System and Desktop Search 其它实用插件等工作中用到了再 ...

  3. Redis工业生产应用场景

    Redis应用场景 国内外三个不同领域巨头分享的Redis实战经验及使用场景 Redis的5个常见使用场景 Redis应用场景 Redis应用场景<张善友>

  4. char* 与 char[] 的区别

    "Hello world"作为静态字符串实际上存储在数据区,但写程序的人不知道这个地址,而程序本身知道.当某一函数以{ char p[] = "Hello world&q ...

  5. Python——eventlet.greenpool

    该模块提供对 greenthread 池的支持. greenthread 池提供了一定数量的备用 greenthread ,有效限制了孵化 greenthread 过多导致的内存不足,当池子中没有足够 ...

  6. Error: package or namespace load failed for ‘rJava’:

    https://stackoverflow.com/questions/30738974/rjava-load-error-in-rstudio-r-after-upgrading-to-osx-yo ...

  7. HttpServletRequest修改/添加header和cookie参数

    实现功能: 所有接口经过过滤器,获取每个接口的自定义头部(token) 判断如果是app访问,则给头部设置cookie,值为自定义token的值. 即:使用过滤器实现修改请求头headers 实现步骤 ...

  8. linux环境下获取真实的ip地址

    package inas.test; import java.net.Inet6Address; import java.net.InetAddress; import java.net.Networ ...

  9. web_submit_data详解

    定义:处理无状态或者上下文无关的表单提交.它用来生成表单的GET或POST请求,这些请求与Form自动生成的请求是一样的,发送这些请求时不需要表单上下文. 函数形式:web_submit_data( ...

  10. 解决网页响应慢,waiting(TTFB)时间过长

    今天下午发现写的一个功能里,ajax等待时间过长 可以看到是waiting(TTFB)时间过长要1秒左右 用浏览器打开PHP页面测试,还是同样问题 将该接口的数据,都注释掉 发现是pdo连接数据库造成 ...