【头歌】数组-稀疏矩阵的转置

news2024/11/24 15:19:47

数组-稀疏矩阵的转置

第1关:一般转置算法

任务描述

本关任务:实现稀疏矩阵的转置操作(采用一般转置算法,即按列序转置)。

相关知识

为了完成本关任务,你需要理解:1. 矩阵的压缩存储,2.稀疏矩阵的三元组顺序表存储表示,3.一般转置算法。

矩阵的压缩存储

矩阵的压缩存储是指:为多个值相同的非零元素只分配一个存储空间,对零元素不分配空间,从而节省存储空间。

稀疏矩阵的三元组顺序表存储表示

稀疏矩阵是指非零元素的个数远远少于总的元素个数,且非零元素的分布没有规律。

稀疏矩阵的压缩存储就是只存储非零元素;且存储非零元素的值的同时,还需存储其所在的行和列。

于是,将非零元所在的行、列及其值构成一个三元组(i,j,v),且按行优先方式排列三元组,从而构成稀疏矩阵的三元组线性表,称为三元组表。

三元组表的存储方式有顺序存储和链式存储,从而可引出稀疏矩阵的两种压缩存储方式:三元组顺序表存储和十字链表存储。

//三元组顺序表存储表示
#define MAXSIZE 100
typedef int datatype;
typedef struct
{
    int i,j;
    datatype v;
}SPNode; //三元组类型
typedef struct
{
    int m,n,t; //矩阵的总行数、总列数及非零元个数
    SPNode data[MAXSIZE];
}SPMatrix;

如:下面图1所示的稀疏矩阵A的三元组顺序表的数据存储情况如图2所示。

img

img

一般转置算法

先在矩阵A的三元组表A.data中找到第0列的非零元素存入转置阵B的三元组表B.data中,再找到第1列存入B.data中,……,这样得到的转置矩阵B的三元组表B.data中的元素必定按行优先存放。

如何在A.data中找第k列?

需对A.data扫描一遍,即:先比较A.data[0].j是否等于k,若相等,则将A.data[0]存入B.data中,接着继续比较下一个A.data[1].j, …… 。

编程要求

在右侧编辑器中补充代码,完成TransSMatrix函数,以实现稀疏矩阵的转置操作。具体要求如下:

* TransSMatrix:求稀疏矩阵A的转置阵B,采用一般转置算法(即按列序转置),稀疏矩阵采用三元组顺序表存储。

测试说明

平台会对你编写的代码进行测试,测试文件为step1/Main.cpp,可在右侧文件夹中进行查看。

输入输出格式: 输入格式: 第一行输入矩阵A的总行数、总列数及非零元个数 第二行按行序输入矩阵A的各个非零元素的行号、列号及值 输出格式: 先输出矩阵A的三元组表,再输出A的转置阵的三元组表。末尾换行。

测试输入:

5 5 6 //输入矩阵A的总行数、总列数及非零元个数

0 2 -9 0 4 5 1 0 -7 1 2 7 3 1 8 4 2 9 //按行序输入矩阵A的各个非零元素的行号、列号及值

预期输出:

The Matrix A:
(0,2,-9)
(0,4,5)
(1,0,-7)
(1,2,7)
(3,1,8)
(4,2,9)
The Transport Matrix of A:
(0,1,-7)
(1,3,8)
(2,0,-9)
(2,1,7)
(2,4,9)
(4,0,5) //末尾换行

开始你的任务吧,祝你成功!

代码示例

/*************************************************************
    稀疏矩阵  实现文件
    更新于2020年10月28日
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SparseMatrix.h"

void input(SPMatrix &a)//输入采用三元组顺序表存储的矩阵
{
	int p;
	scanf("%d%d%d",&a.m,&a.n,&a.t); //输入矩阵总行数、总列数和非零元素的个数
	for(p=0;p<a.t;p++)
		scanf("%d%d%d",&a.data[p].i,&a.data[p].j,&a.data[p].v);
}
void output(SPMatrix a)//输出矩阵的三元组表
{
	int p;
	for(p=0;p<a.t;p++)
		printf("(%d,%d,%d)\n",a.data[p].i,a.data[p].j,a.data[p].v);
}
void TransSMatrix(SPMatrix a, SPMatrix &b)//一般转置,即:按列序转置
{
	// 请在这里补充代码,完成本关任务
    /********** Begin *********/
	b.m=a.n;
    b.n=a.m;
    b.t=a.t;
    if (b.t) {
        int q=0; //三元组表T的下标 
        int p; //三元组表M的下标
        for (int col=0;col<=a.m; col++) { //从最小列顺序开始找 
            for (p=0; p<a.t; p++) { //从三元组表M顺序查找 
                if (a.data[p].j==col) { //三元组表M中当前列是最小列,则进行转置 
                    b.data[q].i=a.data[p].j;
                    b.data[q].j=a.data[p].i;
                    b.data[q].v=a.data[p].v;
                    q++;
                }
            }
        }
    }
  
    /********** End **********/
}

第2关:快速转置算法

任务描述

本关任务:实现稀疏矩阵的转置操作(采用快速转置算法)。

相关知识

为了完成本关任务,你需要理解:1. 稀疏矩阵的三元组顺序表存储表示,2.快速转置算法。

稀疏矩阵的三元组顺序表存储表示

//三元组顺序表存储表示
#define MAXSIZE 100
typedef int datatype;
typedef struct
{
    int i,j;
    datatype v;
}SPNode; //三元组类型
typedef struct
{
    int m,n,t; //矩阵的总行数、总列数及非零元个数
    SPNode data[MAXSIZE];
}SPMatrix;

快速转置算法

一般转置算法效率低的原因是通过对A.data扫描若干遍来找到第0列,第1列,……,共需扫描n遍。我们如果能直接确定A中每一个三元组在B中的位置,则对A.data扫描一遍即可。那么,如何确定A中每一个三元组在B.data中的位置?

设两个数组x[n]和y[n]。其中,x[i]表示A中第i列的非零元的个数,y[i]初始值表示A中第i列第一个非零元在B.data中的位置。

显然有:

y[0]=0
y[1]=y[0]+x[0]
……
y[i]=y[i-1]+x[i-1]

接下来依次扫描A.data,先判断A.data[0],取出A.data[0].j用变量k保存(k=A.data[0].j),表示该三元组是A中第k列第一个非零元,则其在B.data中的位置为q=y[k],接着将该三元组存入B.data[q]中,然后y[k]++,以便将第k列的下一个非零元存放到B.data下一个位置;接着再判断A.data[1],……。

编程要求

在右侧编辑器中补充代码,完成FastTransSMatrix函数,以实现稀疏矩阵的转置操作。具体要求如下:

* FastTransSMatrix:求稀疏矩阵A的转置阵B,采用快速转置算法,稀疏矩阵采用三元组顺序表存储。

测试说明

平台会对你编写的代码进行测试,测试文件为step2/Main.cpp,可在右侧文件夹中进行查看。

输入输出格式: 输入格式: 第一行输入矩阵A的总行数、总列数及非零元个数 第二行按行序输入矩阵A的各个非零元素的行号、列号及值 输出格式: 先输出矩阵A的三元组表,再输出A的转置阵的三元组表。末尾换行。

测试输入:

5 5 6 //输入矩阵A的总行数、总列数及非零元个数

0 2 -9 0 4 5 1 0 -7 1 2 7 3 1 8 4 2 9 //按行序输入矩阵A的各个非零元素的行号、列号及值

预期输出:

The Matrix A:

(0,2,-9)

(0,4,5)

(1,0,-7)

(1,2,7)

(3,1,8)

(4,2,9)

The Transport Matrix of A:

(0,1,-7)

(1,3,8)

(2,0,-9)

(2,1,7)

(2,4,9)

(4,0,5) //末尾换行

开始你的任务吧,祝你成功!

/*************************************************************
    稀疏矩阵  实现文件
    更新于2020年10月28日
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SparseMatrix.h"

void input(SPMatrix &a)//输入采用三元组顺序表存储的矩阵
{
	int p;
	scanf("%d%d%d",&a.m,&a.n,&a.t); //输入矩阵总行数、总列数和非零元素的个数
	for(p=0;p<a.t;p++)
		scanf("%d%d%d",&a.data[p].i,&a.data[p].j,&a.data[p].v);
}
void output(SPMatrix a)//输出矩阵的三元组表
{
	int p;
	for(p=0;p<a.t;p++)
		printf("(%d,%d,%d)\n",a.data[p].i,a.data[p].j,a.data[p].v);
}
void FastTransSMatrix(SPMatrix a, SPMatrix &b)//快速转置
{	
	int p,q,i,k;  int x[N],y[N];
	b.m=a.n; b.n=a.m; b.t=a.t;
	if(b.t==0)
	{
		printf("The matrix has no nonzero element!\n"); return;
	}
	for(i=0;i<a.n;i++) x[i]=0;
	for(p=0;p<a.t;p++) //求A中每一列非零元个数存放到x[ ]中
	{
		/********** Begin *********/
		int k=a.data[p].j;
        x[k]++;
		/********** End **********/
	}
	y[0]=0; 
    y[1]=y[0]+x[0];
	for(i=2;i<a.n;i++)//求A中每一列的第一个非零元在B.data中的位置存放到y[ ]中
	{
		/********** Begin *********/
		y[i]=y[i-1]+x[i-1];
	    /********** End **********/
	}
	for(p=0;p<a.t;p++) //扫描A.data,将A中每一三元组存放到B中恰当位置
	{
		/********** Begin *********/
		int i=a.data[p].j;
        int q=y[i];
        b.data[q].i=a.data[p].j;
        b.data[q].j=a.data[p].i;
        b.data[q].v=a.data[p].v;
        y[i]++;
		/********** End **********/
	}    	
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/514243.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

np读取txt、csv文件的数据

目录 1、基础参数 2、参数详解 3、应用参数示例 机器学习中使用np.loadtxt()可以高效的导入数据&#xff0c;np.loadtxt()适合.txt文件和.csv文件。但是它默认读取float类型的值。 1、基础参数 numpy.loadtxt(fname, dtype, comments#, delimiterNone, convertersNone, s…

11. 类的继承

一、为什么要用继承 一个简化的Student类 class Student { private:string name;string studentID; public:string getName(){ return name; }void setName(string newName) { name newName; }string getStudentID(){ return studentID; }void setStudentID(string newID) {…

操作系统基础知识介绍之内存技术和优化(一)(包含SRAM和DRAM、SDRAM、GDRAMs)

使用 SRAM 可以满足最小化高速缓存访​​问时间的需要。 然而&#xff0c;当缓存未命中时&#xff0c;我们需要尽快将数据从主存中移出&#xff0c;这就需要高带宽内存。 这种高内存带宽可以通过将构成主内存的许多 DRAM 芯片组织成多个内存条并使内存总线更宽来实现&#xff0…

数字孪生可视化开发工具在各行业中的应用

数字孪生就是指在信息化平台内模拟物理实体、流程或者系统&#xff0c;即打造一个现实场景的数字化孪生双胞胎。出于成本和周期考虑&#xff0c;快速低成本搭建数字孪生系统成为中小型企业的期望&#xff0c;深圳华锐视点研发的UE4数字孪生编辑器&#xff0c;是一种能够帮助用户…

【Shell脚本】Linux安装Nginx以及开机自启

目录 一、Linux安装Nginx脚本1、把编写好的安装Nginx脚本放置到nginx.sh文件中2、在检查网络的时候&#xff0c;这里的IP地址&#xff0c;填写的需要安装Nginx服务器的IP地址3、这里的端口号可按照自己的需要进行修改4、安装Nginx脚本 二、Nginx开机自启 一、Linux安装Nginx脚本…

API网关|JD|pinduoduoAPI接入

API网关是什么 在日常工作中&#xff0c;不同的场合下&#xff0c;我们可能听说过很多次网关这个名称&#xff0c;这里说的网关特指API网关&#xff08;API Gataway&#xff09;。字面意思是指将所有API的调用统一接入API网关层&#xff0c;由网关层负责接入和输出。 那么在什…

相遇于此,“相交链表”问题的两种思路

本篇博客会讲解力扣“160. 相交链表”的解题思路&#xff0c;这是题目链接。 老规矩&#xff0c;先来审题。这道题的题干有点长&#xff0c;简而言之&#xff0c;就是判断2个链表是否相交&#xff0c;如果相交就返回第一个相交结点&#xff0c;不相交就返回NULL。看看题目原文…

轻松打造完美客户服务系统,这4个关键点不容错过

客户服务对于一个企业来说非常重要&#xff0c;有以下几个原因&#xff1a; 1、建立客户忠诚度&#xff1a;通过提供高质量的客户服务&#xff0c;可以增加客户满意度和忠诚度。这将有助于企业保持竞争优势并吸引新客户。 2、提高客户满意度&#xff1a;客户对企业的服务感到…

MySQL 升级到 8.0 变慢问题分析

1. 背景介绍 前段时间&#xff0c;客户线上 MySQL 版本从 5.7.29 升级到 8.0.25。 升级完成之后&#xff0c;放业务请求进来&#xff0c;没到一分钟就开始出现慢查询&#xff0c;然后&#xff0c;慢查询越来越多&#xff0c;业务 SQL 出现堆积。 整个过程持续了大概一个小时&…

Java学习笔记 --- Stream流

一、体验Stream流【理解】 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素 把集合中所有以"张"开头的元素存储到一个新的集合 把"张"开头的集合中的长度为3的元素存储到一个新的集合 遍历上一步得到的集合 …

使用群晖NAS Mail Server搭建个性化邮件系统

准备工作 一个顶级域名可以获取公网IP的宽带路由使用DDNS功能&#xff0c;或使用群晖自带DDNS&#xff0c;解析顶级域名可以做“端口映射”的路由器 搭建开始 step1&#xff1a;安装套件 登录群晖NAS&#xff0c;打开[套件中心]&#xff0c;搜索“mail”&#xff0c;安装如…

idea-easyYapi的使用

链接: EasyYapi官方文档. 网上搜到的easyYapi基本上都是千篇一律&#xff0c;比较浅&#xff0c;稍微有点定制的东西都搜不到&#xff0c;帮此把自己的一些心得写出来&#xff0c;后续有新发现也会继续更新 第一步&#xff1a;安装插件 第二步&#xff1a;配置数据 yapi的t…

运营商大数据助力贷款行业快速精准获取意向客户

流量&#xff0c;是企业发展的一大痛点。随着市场格局不断变化&#xff0c;获取流量越来越成为企业摆脱发展困局的一种重要途径&#xff0c;如何在庞大的市场竞争中&#xff0c;实现自身的流量突破&#xff0c;也成为企业所要解决的首要问题。 贷款行业的竞争也很强烈&#xf…

一文总结MySQL面试知识点

文章目录 知识点1 定位慢查询2 存储引擎3 索引4 SQL优化5 事务6 主从同步7 分库分表 问答题1 如何定位慢查询2 那这个SQL语句执行很慢, 如何分析呢&#xff1f;3 MYSQL支持的存储引擎有哪些, 有什么区别 ?4 了解过索引吗&#xff1f;&#xff08;什么是索引&#xff09;5 索引…

录取分数爆降102分,只招一个人也敢报考的狠人!

本期为大家整理热门院校-“华南理工大学”的择校分析&#xff0c;这个择校分析专题会为大家结合&#xff1a;初试复试占比、复试录取规则&#xff08;是否公平&#xff09;、往年录取录取名单、招生人数、分数线、专业课难度等进行分析。希望能够帮到大家! –所有数据来源于研…

排班工具小程序开源版开发

排班工具小程序开源版开发 以下是排班工具小程序可能包含的功能列表&#xff1a; 用户注册和登录功能&#xff0c;支持微信登录和手机号登录。排班管理功能&#xff0c;包括创建、编辑、删除和查询排班表。排班表展示功能&#xff0c;支持按天、周、月等不同时间维度展示排班…

Apache DolphinScheduler 开源之夏学生项目申请开启,6 大课题等你来拿万元奖金!

开源之夏 2023 学生报名已经正式开启&#xff01;Apache DolphinScheduler 今年继续参与开源之夏的活动&#xff0c;2023 年 4 月 29 日-6 月 3 日 15:00 UTC8&#xff0c;同学们可以在开源之夏官网 https://summer-ospp.ac.cn/ 找到 Apache DolphinScheduler 下的项目&#xf…

i春秋 Misc Web 爆破-2

审计一下代码&#xff0c;和爆破-1的区别是&#xff0c;没有了正则匹配&#xff0c;且可变变量$$a变成了普通变量$a&#xff1b; 尝试像爆破-1那样传入超全局变量$GLOBALS 根据回显&#xff0c;我们发现flag不在变量中&#xff08;它还嘲笑我们“too young too simple”太年轻…

后端注册表单验证器实现

视图函数在去注册用户之前需要进行验证&#xff0c;表单验证需要先下载 flask-wtf 在终端执行&#xff1a; pip install flask-wtf新建forms.py import wtforms from wtforms.validators import Email,Length,EqualTo from models import UserModel,EmailCaptchaModel# Form…

详细的步骤在VirtualBox 上安装 CentOS 7

下面是详细的步骤来安装 CentOS 7 在 VirtualBox 上&#xff1a; 下载 CentOS 7 ISO 镜像文件&#xff1a; 前往 CentOS 官方网站的镜像下载页面&#xff1a;Download在页面上找到适合你系统架构的 CentOS 7 ISO 镜像文件&#xff0c;并下载到本地。 安装 VirtualBox&#x…