行逻辑链接的顺序表实现稀疏矩阵的相乘(Java语言描述)
行逻辑链接,带行链接信息。程序有空指针BUG,至今未解决。还是C/C++适合描述算法数据结构。以后复杂的算法还是改用C/C++吧。
有BUG的代码,总有一天会换成没有BUG的。
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 MultMat {
public static void main(String[] args) {
int i,j,k,l;
Scanner scan = new Scanner(System.in);
System.out.println("请输入矩阵M1的行数,列数,非零元的个数:");
int mu1,nu1,tu1;
mu1 = scan.nextInt();
nu1 = scan.nextInt();
tu1 = scan.nextInt();
Mat M1 = new Mat(mu1,nu1,tu1);
//输入矩阵M1
System.out.println("请输入矩阵M1的三元组:");
for(i=1; i<=tu1; i++){
M1.data[i].row = scan.nextInt();
M1.data[i].col = scan.nextInt();
M1.data[i].v = scan.nextInt();
}
System.out.println("输入的矩阵M1为:");
M1.display();
System.out.println("请输入矩阵M2的行数,列数,非零元的个数:");
int mu2,nu2,tu2;
mu2 = scan.nextInt();
nu2= scan.nextInt();
tu2 = scan.nextInt();
Mat M2 = new Mat(mu2,nu2,tu2);
//输入矩阵M2
System.out.println("请输入矩阵M2的三元组:");
for(i=1; i<=tu2; i++){
M2.data[i].row = scan.nextInt();
M2.data[i].col = scan.nextInt();
M2.data[i].v = scan.nextInt();
}
System.out.println("输入的矩阵M2为:");
M2.display();
Mat M3 = new Mat(mu1,nu2,10);
int ctemp[] = new int[mu1 + 1];
int arow,brow=0,tp,t;//M1,M2的行数计数器
/*M1.rpos[1] = 1;
M1.rpos[2] = 3;
M1.rpos[3] = 4;
M2.rpos[1] = 1;
M2.rpos[2] = 2;
M2.rpos[3] = 3;
M2.rpos[4] = 5;*/
int num1[] = new int[mu1+10];
int col1,row1,t1;
for(col1=1; col1<=mu1; col1++){
num1[col1] = 0;
}
for(t1=1; t1<=mu1; t1++){
num1[M1.data[t1].row]++;
}
for(i=1; i<mu1; i++){
M1.rpos[i] = M1.rpos[i - 1] + num1[i - 1];
}
int num2[] = new int[mu2+10];
int col2,row2,t2;
for(col2=1; col2<=mu2; col2++){
num2[col2] = 0;
}
for(t2=1; t2<=mu1; t2++){
num2[M2.data[t2].row]++;
}
for(i=1; i<mu1; i++){
M2.rpos[i] = M2.rpos[i - 1] + num2[i - 1];
}
int p,q,ccol;
for(arow=1; arow<=mu1; arow++){
ctemp[arow] = 0;//当前各行元素累加器清零
M3.rpos[arow] = M3.tu + 1;
if(arow < mu1){
tp = M1.rpos[arow + 1];
}
else{
tp = mu1 + 1;
}
for(p=M1.rpos[arow]; p<tp; p++){
brow = M1.data[p].col;
//System.out.println(p + " " + brow);
if(brow < mu2){
t = M2.rpos[brow + 1];
}
else{
t = tu2 + 1;
}
for(q=M2.rpos[brow]; q<t; q++){
ccol = M2.data[q].col;
ctemp[ccol] += M1.data[p].v * M2.data[q].v;
}
}
for(ccol=1; ccol<=M3.nu; ccol++){
if(ctemp[ccol]!=0){
M3.data[M3.tu].row = arow;
M3.data[M3.tu].col = ccol;
M3.data[M3.tu].v = ctemp[ccol];
}
}
}
System.out.println("相乘后的矩阵为:");
M3.display();
}
}
行逻辑链接的顺序表实现稀疏矩阵的相乘(Java语言描述)的更多相关文章
- 三元组顺序结构实现稀疏矩阵相加,行序优先(Java语言描述)
不用十字链表也可以稀疏矩阵相加时间复杂度最坏情况达到O(tuA + tuB);思路比较简单就不赘述了,代码如下: 三元组: package 行逻辑链接的顺序表实现稀疏矩阵的相乘; public cla ...
- 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)
三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述) 用经典矩阵转置算法和普通的三元组矩阵转置在时间复杂度上都是不乐观的.快速转置算法在增加适当存储空间后实现快速转置具体原理见代码注释部 ...
- 【数据结构】之顺序表(Java语言描述)
之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...
- python 使用顺序表实现栈和队列
栈: # -*- coding: utf-8 -*- # @author: Tele # @Time : 2019/04/24 下午 2:33 # 采用list(顺序表)实现栈结构,后入先出 clas ...
- python---用顺序表实现双端队列
class Dqueue(object): """双端队列""" def __init__(self): self.__list = [] ...
- python---用顺序表实现队列
class Queue(object): """队列""" def __init__(self): self.__list = [] def ...
- bootstrap table 父子表实现【无限级】菜单管理功能
bootstrap table 父子表实现[无限级]菜单管理功能 实现效果 前端代码 <%@ page language="java" import="java.u ...
- hibernate之关于使用连接表实现多对一关联映射
[Hibernate]之关于使用连接表实现多对一关联映射 在我们项目使用中採用中间表最多的一般就是多对一,或者是多对多,当然一对一使用中间表也是能够的,可是这样的几率通常少之又少!所以这里重点介绍多对 ...
- SpringSecurity结合数据库表实现权限认证
SpringSecurity结合数据表实现权限认证: 下面的案例是在SpringBoot框架实现的: 步骤一:准备数据库表 以下是五张表的脚本 ### 用户表 create table Sys_Use ...
随机推荐
- (转)ffmpeg资源一览
一. FFmpeg主站1. FFmpeg的源码发布,资料网址: http://www.ffmpeg.org/ 源代码镜像站点网址:https://github.com/FFmpeg/FFmpeg 2 ...
- C++编程经验-返回局部变量的讨论(转)
返回局部变量没问题 如果返回局部变量有问题,函数的意义还有吗? 全局变量还用返回吗? 返回指向局部变量的指针才有问题, 函数退栈之后,局部变量消失, 指针将指向未知区域,所以出现问题. 返回局部 ...
- Java设计模式六大原则之场景应用分析
定义:不要存在多于一个导致类变更的原因. 通俗的说.即一个类仅仅负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而须要改动类T时,有可能会导致原本执行正 ...
- redis集群【转】
一.环境 系统 CentOS7.0 64位最小化安装 redis1 172.16.1.46 6379,6380 redis2 172.16.1.47 6379,6380 ...
- 如何构建高性能MySQL索引
本文的重点在于如何构建一个高性能的MySQL索引,从中你可以学到如何分析一个索引是不是好索引,以及如何构建一个好的索引. 索引误区 多列索引 一个索引的常见误区是为每一列创建一个索引,如下面创建的索引 ...
- Global.asax的Application_BeginRequest实现url重写无后缀的代码
本文为大家详细介绍下利用Global.asax的Application_BeginRequest 实现url重写其无后缀,具体核心代码如下,有需求的朋友可以参考下,希望对大家有所帮助 利用Global ...
- Grunt--Less
摘要: 之前介绍了自动构建工具Grunt,其中有一个模块是"grunt-contrib-less",下面是配置Grunt自动编译less文件. 安装: Grunt是基于node,功 ...
- 字符串中包含汉字和\u,显示出汉字来
针对py2,py3不需要这样.#coding=utf8import sysreload(sys)sys.setdefaultencoding('utf8') strx2='你好\u4e2d\u56fd ...
- 【scala】 scala 映射和元组操作(四)
1.映射 Map 定义 ,取值,遍历,排序 2. 元组 定义,取值,拉链操作 import scala.collection.mutable /** * 映射和元组 * * @author xwol ...
- 8 -- 深入使用Spring -- 1...4 重写占位符配置器
8.1.5 重写占位符配置器 (PropertyOverrideConfigurer) PropertyOverrideConfigurer是Spring提供的另一个容器后处理器.PropertyOv ...