实验五(数据结构与算法实验) 稀疏矩阵

2023-10-30

实验五(数据结构与算法实验) 稀疏矩阵

稀疏矩阵ADT的实现:

在现实应用中,一些规模很大的特殊矩阵具有重要的地位。特殊矩阵可以采用二维数组存储,简单直接(顺序存储方式保持了矩阵中元素之间的二维线性关系),矩阵操作的算法都很简单,但是其空间的利用率很低(因为重复元素或零元素比较多)。 稀疏矩阵就是一种应用很广泛的特殊的矩阵,在实现稀疏矩阵ADT时通常采用“压缩”存储方案,即把只存储稀疏矩阵的非零元素,把稀疏矩阵抽象成为一个以三元组(行,列,值)为数据元素的线性表来处理,而我们知道:线性表可以采用顺序存储,也可以采用链式存储(通常用十字链表)。

现要求编程实现稀疏矩阵在“压缩”存储时的常用操作,如输出、转置、求和、乘等。(注:在代码注释中说明你采用的存储结构)

需要输入两个矩阵,完成:

(1) 转置。对第一个矩阵进行转置并输出,前面输出标题 “The transformed matrix is:”

(2) 矩阵加。如两个矩阵可以相加,进行两个矩阵加并输出,前面输出标题 “The added matrix is:”

                   如果不能相加输出 “Can not add!”;

(3) 矩阵乘。如果两个矩阵可以相乘,进行两个矩阵乘并输出,前面输出标题 “The product matrix is:”

                        如果不能相乘输出 “Can not multiply!”

矩阵的输入:有多行,第1行包括三个整数,分别是矩阵的大小m,n及非零元素的个数r。后面r行分别输入各个非零元素的 行、列、值。

矩阵的输出:有两种形式,操作时分别用符号“L”、“H”指出输出形式。

L: 以三元组的形式输出,即先输出矩阵的行数、列数和非零元素个数,再依次输出各个非零元素的行、列和值。

H: 按人们习惯的矩阵格式输出,即输出一个m*n的矩阵,是零元素的输出0,非零元素输出元素值。设定每个元素占位宽度为4。(要输出行号和列号,并对齐)

 

例如:输入如下:

10 8 4   //第1个矩阵 10行,8列,4个非零元素

1 8 1    //第1行第8列元素值为1

3 3 2    //第3行第3列元素值为2

3 7 3    //第3行第7列元素值为3

10 1 4   //第10行第1列元素值为4

10 8 2   //第2个矩阵 10行,8列,2个非零元素

2 6 1    //第2行第6列元素值为1

3 7 -3    //第3行第7列元素值为-3

H   //输出格式类别

 

输出如下:

The transformed matrix  is:

        1   2   3   4   5   6   7   8   9  10

   1   0   0   0   0   0   0   0   0   0   4

   2   0   0   0   0   0   0   0   0   0   0

   3   0   0   2   0   0   0   0   0   0   0

   4   0   0   0   0   0   0   0   0   0   0

   5   0   0   0   0   0   0   0   0   0   0

   6   0   0   0   0   0   0   0   0   0   0

   7   0   0   3   0   0   0   0   0   0   0

   8   1   0   0   0   0   0   0   0   0   0

The added matrix is:

       1   2   3   4   5   6   7   8

   1   0   0   0   0   0   0   0   1

   2   0   0   0   0   0   1   0   0

   3   0   0   2   0   0   0   0   0

   4   0   0   0   0   0   0   0   0

   5   0   0   0   0   0   0   0   0

   6   0   0   0   0   0   0   0   0

   7   0   0   0   0   0   0   0   0

   8   0   0   0   0   0   0   0   0

   9   0   0   0   0   0   0   0   0

  10   4   0   0   0   0   0   0   0

Can not multiply!

 

再如,输入矩阵如下:

100 90 5     //矩阵的行数为100,列数为90,共5个非零元素。

1 10 100     //a(1,10)=100

50 60 200    //a(50,60)=200

50 80 100    //a(50,80)=100

60 60 200    //a(60,60)=200

99 89 10    //a(99,89)=10

100 90 4     //矩阵b的行数为100,列数为90,共4个非零元素。

1 1 10       //b(1,1)=10

50 60 -200    //b(50,60)=-200

50 80 100     //b(50,80)=100

70 70 10     //b(70,70)=10

L

 

输出如下:

The transformed matrix  is:

Rows=100,Cols=90,r=5

10 1 100

60 50 200

60 60 200

80 50 100

89 99 10

The added matrix is:

Rows=100,Cols=90,r=6

1 1 10

1 10 100

50 80 200

60 60 200

70 70 10

99 89 10

Can not multiply!




#pragma comment(linker, "/STACK:1024000000,1024000000")
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>

using namespace std;

#define rep(i , a , b) for(register int i=(a);i<=(b);i++)
#define per(i , a , b) for(register int i=(a);i>=(b);i--)
#define ms(s) memset(s, 0, sizeof(s))
#define squ(x) (x)*(x)

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int , int> pi;


const int maxn = 1e6+10;

struct mat{
    int x,y;
    int z;
}a[maxn],b[maxn],c[maxn];

map<pi ,int>mp;
map<pi ,int>::iterator it;
bool vis[maxn];
int r1,c1,r2,c2,cnt1,cnt2;
int r3,c3,cnt3;
char op[4];

bool cmp(mat A,mat B) {
    if(A.x!=B.x) return A.x<B.x;
    if(A.y!=B.y) return A.y<B.y;
    return A.z<B.z;
}
template<class T>
inline void read (T &x) {
    x = 0;
    int sign = 1;
    char c = getchar ();
    while (c < '0' || c > '9') {
        if ( c == '-' ) sign = - 1;
        c = getchar ();
    }
    while (c >= '0' && c <= '9') {
        x = x * 10 + c - '0';
        c = getchar ();
    }
    x = x * sign;
}

void print1() {
    printf ("Rows=%d,Cols=%d,r=%d\n",r3,c3,cnt3);
    rep(i,1,cnt3) {
        printf ("%d %d %d\n",c[i].x,c[i].y,c[i].z);
    }
}

void print2() {
    printf ("    ");
    rep(i,1,c3) {
        printf ("%4d",i);
    }
    printf ("\n");
    rep(i,1,r3) {
        rep(j,0,c3) {
            if(j==0) {
                printf ("%4d",i);
                continue;
            }
            int tmp=0;
            if(!mp.count ({i,j})) printf ("%4d",tmp);
            else {
                tmp = mp[{i,j}];
                printf ("%4d",tmp);
            }
        }
        printf ("\n");
    }
}

void add() {
    ms (vis);
    mp.clear ();
    r3=r1;c3=c1;cnt3=0;
    rep(i,1,cnt1) {
        int x = a[i].x,y = a[i].y,z = a[i].z;
        rep(j,1,cnt2) {
            if(x==b[j].x&&y==b[j].y) {
                z+=b[j].z;
                vis[j]=1;
            }
        }
        if(z==0) continue;
        else {
            c[++cnt3].z=z;
            c[cnt3].x=x;
            c[cnt3].y=y;
            mp[{x,y}]=z;
        }
    }
    rep(i,1,cnt2) {
        if(vis[i]) continue;
        if(b[i].z==0) continue;
        c[++cnt3].z=b[i].z;
        c[cnt3].x=b[i].x;
        c[cnt3].y=b[i].y;
        mp[{c[cnt3].x,c[cnt3].y}]=c[cnt3].z;
    }
    sort(c+1,c+1+cnt3,cmp);
    printf ("The added matrix is:\n");
    if(op[0]=='L') {
        print1();
    } else {
        print2();
    }
}

void mul() {
    ms(vis);mp.clear ();
    r3=r1;c3=c2;cnt3=0;
    rep(i,1,cnt1) {
        int x = a[i].x,y=a[i].y,z=a[i].z;
        rep(j,1,cnt2) {
            if(y==b[j].x) {
                int tmp=z*b[j].z;
                mp[{x,b[j].y}]+=tmp;
            }
        }
    }
    for(it=mp.begin ();it!=mp.end ();it++) {
        pi p = (*it).first;
        int z = (*it).second;
        if(z==0) continue;
        c[++cnt3].z=z;
        c[cnt3].x=p.first;
        c[cnt3].y=p.second;
    }
    sort (c+1,c+1+cnt3,cmp);
    printf ("The product matrix is:\n");
    if(op[0]=='L') {
        print1 ();
    }
    else print2 ();
}

void tr() {
    r3=c1;c3=r1;cnt3=0;
    ms(vis);
    rep(i,1,cnt1) {
        if(a[i].z==0) {
            continue;
        }
        c[++cnt3].x=a[i].y;
        c[cnt3].y=a[i].x;
        c[cnt3].z=a[i].z;
        mp[{c[cnt3].x,c[cnt3].y}]=c[cnt3].z;
    }
    sort (c+1,c+1+cnt3,cmp);
    printf ("The transformed matrix is:\n");
    if(op[0]=='L') {
        print1 ();
    }
    else print2 ();
    mp.clear ();
}

int main(int argc, char * argv[])
{
    read (r1);read (c1);read (cnt1);
    rep(i,1,cnt1) {
        read(a[i].x);read(a[i].y);read (a[i].z);
    }
    read (r2);read (c2);read (cnt2);
    rep(i,1,cnt2) {
        read(b[i].x);read(b[i].y);read(b[i].z);
    }
    scanf("%s",op);
    sort(a+1,a+1+cnt1,cmp);
    sort(b+1,b+1+cnt2,cmp);
    tr();
    if(r1==r2&&c1==c2) {
        add();
    }
    else {
        printf ("Can not add!\n");
    }
    if(c1==r2) {
        mul();
    }
    else {
        printf ("Can not multiply!\n");
    }
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实验五(数据结构与算法实验) 稀疏矩阵 的相关文章

  • 软件设计师(十)网络与信息安全基础知识

    计算机网络是由多台计算机组成的系统 与传统的单机系统 多机系统相比有很大的区别 一 网络概述 计算机网络是计算机技术与通信技术相结合的产物 它实现了远程通信 远程信息处理和资源共享 1 计算机网络的概念 计算机网络的定义是利用通信设备和线路
  • 三种主流的Web服务实现方案(REST+SOAP+XML-RPC)简述及比较

    目前知道的三种主流的Web服务实现方案为 REST 表象化状态转变 软件架构风格 SOAP 简单对象访问协议 XML RPC 远程过程调用协议 下面分别作简单介绍 REST 表征状态转移 Representational State Tra
  • GIT本地代码处于detached HEAD的情况(又称游离状态)的解决办法

    有时候git由于一些操作的问题出现了detached HEAD 的情况 对于新手来说很焦急 但又不敢动 生怕搞错点什么把劳动成果付之东流 下面的解决办法要顺序执行 先 git commit 进行提交 提交完你的本地分支指向的是你刚commi
  • FM33G0XX-创建一个KEIL工程的步骤

    1 说明 本文章为 FM33G 系列低功耗 MCU 创建 keil 工程 FM33G0XX 系列是复旦微电子 公司开发的低功耗 MCU 芯片 2 创建一个 keil 工程的步骤 2 1 新建功能文件夹 这里我们建立一个文件夹为 Templa
  • Ethereum以太坊区块链底层换用国密算法实验报告

    区块链技术的基础是计算机密码学 可以说 没有计算机密码学 就没有区块链技术 区块链在如下方面用到了计算机密码学 验证签名 保证交易发起的真实性 用到了ECDSA 哈希校验区块完整性 保证不可篡改特性 用到了hash算法 以太坊中具体用到sh
  • 一个java文件中是否可以定义多个类

    title 一个java文件中是否可以定义多个类 date 2017 12 31 1 53 43 tags Java基础 基本概念 categories Java基础 一个java文件中可以定义多个类 但是最多只有一个类被public修饰
  • 如何在宝塔面板中使用小皮面板的数据库(mysql)

    1 关闭mysql service mysqld stop 2 查看是否有僵尸进程残留 ps ef grep mysqld 如果存在 则杀掉进程 kill quit 进程号 或者 kill 9 进程号 3 复制小皮面板的mysql 的 da
  • 一款新的网页设计工具,简单好用

    之前一直在找一些智能化的 简单操作的网页设计工具 后来发现这个VXPLO 还蛮好用的 使用地址http www vxplo cn VXPLO是互联网上出现的第一款基于云计算方式的交互式网页设计工具 也是一个互动作品分享平台 大家需要网页设计
  • 蓝桥杯:火星人(全排列模板) Java

    import java util ArrayList import java util Arrays import java util LinkedList import java util List import java util Sc
  • Python编程题

    1 输入直角三角形的两个直角边的长度a b 求斜边c的长度 from math import sqrt 从math库中导入sqrt方法 a eval input 输入直角边a的长度 b eval input 输入直角边b的长度 c sqrt
  • Python FastAPI上传文件至七牛云

    最近需要给博客添加上传图片的功能 之前有图片上传的 上传主题图片的 考虑到博客的话图片太多就不存到服务器了 存到七牛云上比较好 相关的图片服务也比较多 我的上传流程是 前端上传图片至服务器 服务器在上传到七牛云 我的后台使用的是Python
  • linux系统的宝塔面板密码忘记了?用户名忘记了?访问地址忘记了?安全入口忘记了?宝塔服务是否已开启?以下是解决方法!修改密码、修改用户名、修改访问端口、修改安全入口等等!

    宝塔面板 在Linux系统下 宝塔面板 BT Panel 可以帮助用户简化服务器的管理和配置 宝塔面板适用于多个Linux发行版 如CentOS Ubuntu等 并提供了图形化的界面 使得用户可以通过简单的点击和配置来完成各种操作 使用宝塔
  • VS2017 创建动态链接库并使用

    下面我们直接步入正题 1 首先在VS2017中新建Dll项目 2 组织你的项目工程目录如下 3 其中 MyDll h文件中的代码为 pragma once ifdef MY DLL EXPORTS define MY DLL EXP dec
  • redis打开若依前端出现端口错误无法显示验证码

    解决方案 由深到表 1 redis服务没有开 箭头朝下 2 redis cli没有开 箭头朝下 3 redis cli打开后报错及解决 我出现的问题是自己在这两个文件设置了密码 但是没有输入导致无法连接 可以去查下如何在文件内设置redis
  • paramiko的两种简单用法,sftp上传下载,执行服务器cmd

    注 1 安装paramiko之前需要安装pycrypto 2 需要服务端添加你的公钥权限你才能使用对应的私钥 1 上传下载文件 import paramiko privatekeyfile 私钥的地址 mykey paramiko RSAK
  • 软件测试综述-软件开发过程

    1 软件产品构成的主要部分 1 客户需求 2 产品说明书 3 进度表 4 软件设计文档 包括 结构文档 数据流图 状态转换图 流程图 代码注释等 5 测试文档 包括 测试计划 测试用例 缺陷报告 测试工具和自动测试 质量 统计和总结 2 软
  • POJ-1416 Shredding Company(DFS)

    题目链接 点击打开链接 大致题意 公司现在要发明一种新的碎纸机 要求新的碎纸机能够把纸条上的数字切成最接近而不超过target值 比如 target的值是50 而纸条上的数字是12346 应该把数字切成四部分 分别是1 2 34 6 因为这
  • 推荐系统-基于用户的协同过滤(User-based CF)

    基于邻域的算法应该算是推荐系统中最基础的算法之一了 主要包括基于用户的协同过滤和基于物品的协同过滤 我觉得他们是最符合直觉的推荐算法了 你想想看 如果给你若干人的行为数据 你怎么去做推荐 一个就是找到和他最相似的用户 因为他们臭味相投 所以
  • SpringCloud之Eureka的报错(版本神坑)

    一 报错内容 2021 09 12 14 47 53 594 INFO 20640 freshExecutor 0 com netflix discovery DiscoveryClient Disable delta property f
  • springboot如何实现短信验证注册和短信验证码登录

    Spring Boot实现短信验证注册和短信验证码登录的步骤如下 1 集成短信服务 选择一个短信服务商 例如阿里云 腾讯云等 并集成该服务商提供的API 2 实现短信发送接口 编写一个短信发送的接口 该接口需要传入手机号并发送短信验证码到该

随机推荐

  • C#Socket通信基础方法知识整理

    一 IP地址操作类 1 IPAddress类 a 在该类中有一个 Parse 方法 可以把点分的十进制IP表示转化成IPAddress类 方法如下 IPAddress address IPAddress Parse 192 168 0 1
  • python sqlite3

    含数据库连接 表创建 增删改查 查看sqlite数据库的软件推荐使用sqlitestudio 下载地址 sqlitestudio SQLite文档类资源 CSDN下载 coding utf 8 乐乐感知学堂公众号 author https
  • SQL Server如何备份数据库

    一 首先把当前的数据库备份成一个文件 1 按照操作来 选择对应的数据库 确定备份文件的存储位置 点击确定 生成备份文件 2 然后可以通过该备份文件还原数据库 右键数据库点击还原文件和文件组 然后设置目标数据库的名字 如果数据库中已经存在相同
  • TSINGSEE青犀视频安防监控管理平台EasyNVR如何配置鉴权?

    视频监控汇聚平台EasyNVR是基于RTSP Onvif协议的视频平台 可支持将接入的视频流进行全平台 全终端的分发 分发的视频流包括RTSP RTMP HTTP FLV WS FLV HLS WebRTC等格式 为了满足用户的集成与二次开
  • Qt 串口类QSerialPort 使用笔记

    Qt 串口类QSerialPort 使用笔记 虽然现在大多数的家用PC机上已经不提供RS232接口了 但是由于RS232串口操作简单 通讯可靠 在工业领域中仍然有大量的应用 Qt以前的版本中 没有提供官方的对RS232串口的支持 编写串口程
  • virtual box安装Ubuntu操作系统

    在提供Ubuntu 18 10 Cosmic Cuttlefish映像的地址中有ubuntu 18 10 desktop amd64 iso和ubuntu 18 10 live server amd64 iso版本 它们是什么区别 简单的说
  • 机器学习——所有非支持向量的拉格朗日乘子一定为0

    问 SVM模型求解过程中所有非支持向量的拉格朗日乘子一定为0 答 正确 SVM模型的求解过程中 对于非支持向量的数据点 其对应的拉格朗日乘子为0 这是因为非支持向量数据点已经满足了约束条件 不需要对目标函数造成日对目标函数有贡献 简而言之
  • UDIMM、RDIMM和LRDIMM

    UDIMM RDIMM和LRDIMM UDIMM UDIMM 全称Unbuffered DIMM 即无缓冲双列直插内存模块 指地址和控制信号不经缓冲器 无需做任何时序调整 直接到达DIMM上的DRAM芯片 UDIMM由于在CPU和内存之间没
  • 基于python的Page Factory模式

    Pythium 基于 Python 的 Page Factory 设计模式测试库 类似于Java的Page Factory模式 旨在减少代码冗余 简单易用 具有高度的可扩展能力 支持以 annotation的方式定义元素 支持同一个元素多种
  • 【Unity 3D学习笔记】P&D 过河游戏智能实现

    P D 过河游戏智能帮助实现 实现状态图的自动生成 讲解图数据在程序中的表示方法 利用算法实现下一步的计算 对于过河游戏 首先需要知道其中各个状态之间的转换关系 绘制状态转移图如下 其中 P代表出发岸上的牧师 D代表出发岸上的恶魔 加号和减
  • 竞品分析该怎么做

    竞品分析 作用 知己知彼 百战不殆 为自身产品设计提供功能 可用性 关键技术等方面的参考 提高自身产品的差异化程度 为新立项的产品 拍脑袋想出来的 降低风险 如何选择竞品 行业内领先的产品 通常可以根据一些百度指数 行业排名 业务相似程度来
  • 四款Python在线模拟器

    一 菜鸟工具 地址 http c runoob com compile 9 打开的界面是酱紫的 左边是代码输入框 右边是结果输出框 特点 1 支持切换Python2 Python3版本 2 不支持常用导入模块 例如pandas等 3 运行速
  • 使用Python生成docx文档

    1 首先需要安装doxc的公共库 pip install python docx U 2 安装成功后 使用这个库的方法import docx 3 这样生成的docx内容会有汉字显示不出来 4 这样生成的docx会有乱码 需要调整字体格式添加
  • 解决linux磁盘空间不足的方法

    磁盘空间不足的解决办法 1 首先确定是否是磁盘空间不足 输入命令 df h 查看磁盘信息 很明显 Filesystem下的挂载点 dev vda1 下的50G容量已经耗尽 这时最简单的办法就是找到大且无用的文件并删除 首选就是log文件 2
  • Flutter 常见问题总结

    文章目录 1 内容简介 2 使用Column等容器包裹ListView报错的问题 3 Navigator operation requested does not include a Navigator 4 设置Container背景色 5
  • Java开发中使用sql简化开发

    引语 在Java开发中 我们更希望数据库能直接给我们必要的数据 然后在业务层面直接进行使用 所以写一个简单的sql语句有助于提高Java开发效率 本文由简单到复杂的小白吸收 还请多多指教 使用MySQL数据库 先创建一个简单的表 DROP
  • elemenui自己本地跑起存在的问题&做自定义组件迭代规范

    npm install安装依赖出现PhantomJS not found on PATH 问题 PhantomJS not found on PATH PhantomJS not found on PATH Downloading http
  • 在 React 中应用设计模式:策略模式

    这篇文章是关于我们许多人在 React 和前端开发中遇到的一个问题 有时甚至没有意识到这是一个问题 在不同的组件 钩子 实用程序等中实现了一段逻辑 让我们深入了解问题的详细信息以及如何解决它 正如标题所暗示的 我们将使用策略模式来解决它 问
  • react性能优化的几种方法

    react性能优化的6中方法 1 避免使用内联函数 每次render渲染时 都会创建一个新的函数实例 应该在组件内部创建一个函数 讲事件绑定到函数 这样每次调用render时 就不会创建单独的函数实例 2 使用react fragement
  • 实验五(数据结构与算法实验) 稀疏矩阵

    实验五 数据结构与算法实验 稀疏矩阵 稀疏矩阵ADT的实现 在现实应用中 一些规模很大的特殊矩阵具有重要的地位 特殊矩阵可以采用二维数组存储 简单直接 顺序存储方式保持了矩阵中元素之间的二维线性关系 矩阵操作的算法都很简单 但是其空间的利用