三元组顺序结构实现稀疏矩阵相加,行序优先(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++;
}
}
} }
三元组顺序结构实现稀疏矩阵相加,行序优先(Java语言描述)的更多相关文章
- 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)
三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述) 用经典矩阵转置算法和普通的三元组矩阵转置在时间复杂度上都是不乐观的.快速转置算法在增加适当存储空间后实现快速转置具体原理见代码注释部 ...
- 行逻辑链接的顺序表实现稀疏矩阵的相乘(Java语言描述)
行逻辑链接,带行链接信息.程序有空指针BUG,至今未解决.还是C/C++适合描述算法数据结构.以后复杂的算法还是改用C/C++吧. 有BUG的代码,总有一天会换成没有BUG的. package 行逻辑 ...
- 【数据结构】之顺序表(Java语言描述)
之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...
- Java流程控制:顺序结构
一.流程控制 Java中的流程控制语句可以这样分类:顺序结构.选择结构.循环结构.这三种结构就足够解决所有的问题了! 二.顺序结构 描述: Java流程控制的基本结构就是顺序结构,除非特别指明,否则J ...
- C语言程序设计第二次作业——顺序结构
(一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. 错误信息1: 错误原因:i和d位置错误 改正方法:i和d位置互换 错误信息2: 错误原因:\n后缺了一个" 改正方法:\n后加一个 ...
- C语言第二次作业——顺序结构
一.改错题 1.输出带框文字:在屏幕上输出以下3行信息. (1)源程序 对程序进行编译,发现错误信息1 错误原因:stdio拼写错误 改正方法:将stdio正确拼写 对程序进行编译,发现错误信息2 错 ...
- C++ 用三元组表示法存储稀疏矩阵
若有一个矩阵(m*n),其中非0元素个数远少于数值为0的元素个数,若开辟一个m*n大空间,来存储这样一个很多元素值为0的矩阵,浪费空间,于是我们只存储这些非0的元素的下标及数值 用一个结构体——三元组 ...
- 12 (H5*) JS第二天 流程控制:顺序结构、分支结构、循环结构
目录 1:一元运算符 2:流程控制 3:分支之if语句 4:分支之if-else语句 5:分支语句之三元运算符 6:if和else if语句 7:switch-case语句 8:while循环 9:d ...
- C#学习笔记11:C#中的顺序结构、分支结构、循环结构
顺序结构: 代码从Main()函数开始运行,从上到下,一行一行的执行,不漏掉代码. Int a=6; int b=5; int c=a+b; Console.Write(c); 分支结构: 代码有可能 ...
随机推荐
- Keystone API
Keystone身份API简介 Keystone提供REST风格的API, 客户端可以通过HTTP方法和URL操作资源. Keystone有两个主要版本的API, 以及构建在这些核心API上的一些AP ...
- LVS 实现负载均衡原理及安装配置详解
负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学 ...
- 各种linux小操作
1.查看路由表 命令:route -n ; netstat -r 跟踪网络地址:traceroute www.16 3.com 2.查看一台机器IP地址和与其对应的域名 命令:nslookup; di ...
- linux静止ping的方法
ping是一个通信协议,是ip协议的一部分,tcp/ip 协议的一部分.利用它可以检查网络是否能够连通,用好它可以很好地帮助我们分析判定网络故障.应用格式为:Ping IP地址.但服务启用ping有时 ...
- C# 各种输入格式验证#各种输入格式验证
/// <summary> /// 各种输入格式验证 /// </summary> public class ValidateUtil { private static Reg ...
- 命令行编译C++程序
使用命令行来编译C++程序,我们可以有两种方法: 方法一: 1. 依次打开开始程序->Visual Studio 2010 –>Visual Studio tool ...
- rlwrap安装报错You need the GNU readline 解决方法
首先大家肯定知道rlwrap是干什么的? 在linux以及unix中,sqlplus的上下左右.回退无法使用,会出现乱码情况.而rlwrap这个软件就是用来解决这个的. 这个错误曾经困扰我很久很久 ...
- sql server 2005 怎么看是不是企业版
已经安装了SQL server 2005 怎么确定它是企业版 还是标准版??? 执行sql:SELECT @@VERSION在结果里看,比如我这里是(里面有Enterprise Edition,表示企 ...
- DNS服务器介绍及设置
DNS服务器是指“域名解析服务器”,而域名就是我们通常所说的“网址”.在互联网中识别和寻找不同的计算机,实际上是需要知道该计算机的IP地址才能进行访问.比如220.181.38.4,这个IP就是百度的 ...
- opencv3.2将中文输出到图片上
opencv自带的putText函数无法输出utf8类型的字符,因此无法将中文打印到图片上.用这篇文章的freetype可以实现中文输出,但是需要将字符解码转码比较麻烦,而Pillow的Image函数 ...