【数据结构】稀疏矩阵的快速转置

【数据结构】稀疏矩阵的转置(普通转置 和 快速转置)

目录

  • 【数据结构】稀疏矩阵的转置(普通转置 和 快速转置)
    • 三元表
    • 稀疏矩阵的转置
    • 方法一(普通转置)复杂度为O(T.mu×T.nu)
    • 方法二:快速转置 复杂度O(S.nu+S.tu)

知识点可参考文章: 【数据结构】数组(稀疏矩阵、特殊矩阵压缩、矩阵存储、稀疏矩阵压缩、稀疏矩阵的快速转置、十字链表)

三元表

三元表结构:
在这里插入图片描述

//三元表结构:
typedef struct{  int i, j;       //非零元的行、列下标 int e;   //非零元的值
} Triple;//稀疏矩阵的结构
#define MAXSIZE 100  //非零元最大个数
typedef struct{  Triple data[MAXSIZE + 1];       //三元组表,data[0]未用int mu, nu, tu; //矩阵行、列数、非零元个数
} TSMatrix;

特点:
有序的双下标法行序有序存储
便于进行依行顺序处理的矩阵运算
若需存取某一行中的非零元,需**从头开始查找**。
非零元以行为主序顺序存放

压缩存储后,元素aij的存储位置与其下标无关,而取决于之前的非零元个数。

稀疏矩阵的转置

解决思路:

  1. 将矩阵行、列维数互换,非零元个数不变
  2. 将每个三元组中的i和j相互调换,非零元值不变
  3. 重排次序,使T.data中元素以T的行(M的列)为主序
    在这里插入图片描述

方法一(普通转置)复杂度为O(T.mu×T.nu)

转置运算:一个 m * n 的矩阵 M ,其对应的转置矩阵是一个 n * m 的矩阵 T ,并且 T 中的元素 T(i, j) 与 B 中的元素 M(j, i) 对应相等。

  1. 我们需要将三元组的行列互换,要构造一个转置矩阵 T 的三元组表,并且这个三元组表中的次序也要满足按照行为主序排列,按照列为次序排列。
  2. 由于 T 中的行对应的是 M 中的列,所以在转置过程中,我们需要顺序枚举每一列。
  3. 所以普通的稀疏矩阵转置方法为:
    (1)按矩阵T中三元组表T.data的次序依次在矩阵M的三元组表M.data中找到相应三元组进行转置
    (2) 为找到M.data中第i列所有非零元素,需对M.data扫描一遍
    (3) 由于M.data以M行序为主序,所以得到的恰是T.data中应有的顺序
//复杂度为O(T.mu×T.nu)
Status TransposeSMatrix(TSMatrix M, TSMatrix &T){ int col, p, k;T.mu=M.nu;  T.nu=M.mu; T.tu=M.tu; if(T.tu){ //有非零元,转置k=1;//k为T.data表下标for(col=1;col<=M.nu;col++)//查找M每一列的非零元for( p=1;p<=M.tu;p++)//扫描M的所有非零元if( M.data[p].j==col ){ T.data[k].i=M.data[p].j;T.data[k].j=M.data[p].i;T.data[k].e=M.data[p].e; k++;}return OK;}return ERROR;
}//T(n)=O(M.nu×M.tu)
//若M.tu与M.mu×M.nu同数量级则 T(n)=O(M.mu×M.nu^2)

方法二:快速转置 复杂度O(S.nu+S.tu)

定义一个数组num[] 来记录原矩阵 M 中每一列非零元的个数, 同时再定义一个数组 cpot[] 用来记录 M 中每一列第一个非零元在T 中对应的位置。

  1. 首先,我们定义两个辅助数组:
    num[]:用于记录原矩阵 M 中每一列非零元素的个数。
    cpot[]:用于记录 M 中每一列第一个非零元素在转置矩阵 T 中对应的位置。
  2. 扫描原矩阵 M 三次:
    第一次:记录元素矩阵 S 中每列的非零元素个数,并存储在 num[] 中。
    第二次:计算每列第一个非零元素在新矩阵 T 中的首位置,并存储在 cpot[] 中。
    第三次:根据 cpot[] 的信息,将原矩阵 M 转置到新矩阵 T 中。
  3. 在转置过程中,我们遍历原矩阵 M 的每一个非零元素,根据其列号找到在新矩阵 T 中的正确位置,并将元素交换到该位置。

具体代码加注释如下:

//复杂度O(S.nu+S.tu) 
//若S.tu与S.mu×S.nu同数量级则 T(n)=O(S.mu×S.nu)
void TransPose_F(TSMatrix S,TSMatrix &Transpose_S){//S为原来矩阵//Transpose_S为转置后矩阵Transpose_S.mu=S.nu;Transpose_S.nu=S.mu;Transpose_S.tu=S.tu;if(S.tu){//判断是否为空int col;//列int num[MAXSIZE]={0};// 记录原三元组中列号为 col 的项的数目。 辅助数组int cpot[MAXSIZE]={0};// 记录原三元组中列号为 col 的项在新三元组中的首位置。 辅助数组//扫描第一次 记录元素矩阵S中列数为j的个数for(int i=1;i<=S.tu;i++){//记录元素矩阵S中列数为j的个数num[S.data[i].j]++;}cpot[1]=1;//初始化第一个元素的地址//扫描第二次 记录原三元组中列号为 col 的项在新三元组中的首位置for(col=2;col<=S.nu;col++){//列号为 col 的项在新三元组中的首位置cpot[col]=cpot[col-1]+num[col-1];}//扫描第三次 转置for(int t=1;t<=S.tu;t++){col=S.data[t].j;//列数int s=cpot[col];//地址  下标Transpose_S.data[s].e=S.data[t].e;Transpose_S.data[s].i=S.data[t].j;Transpose_S.data[s].j=S.data[t].i;cpot[col]++;//下标 后移}}
}

感谢阅读!
前几期期链接:

  1. 【数据结构】栈与队列的概念和基本操作代码实现
  2. 【数据结构】树与二叉树的概念与基本操作代码实现
  3. 【数据结构】数组(稀疏矩阵、特殊矩阵压缩、矩阵存储、稀疏矩阵压缩、稀疏矩阵的快速转置、十字链表)

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

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

相关文章

springboot的特点以及优缺点

什么是springboot Spring Boot是一个开源的Java框架,用于创建独立的、基于Spring的应用程序。它简化了Spring应用程序的配置和部署过程,并提供了自动配置的功能,让开发人员能够更专注于业务逻辑的实现,而不需要过多地关注配置问题。 Spring Boot内置了一些常见的第三方库和…

【2024年5月】如何高效寻找软考高级论文素材?

一、自己做过的项目 若自己有做过的项目&#xff0c;那就是最好的&#xff01;建议不要换其他的项目来写&#xff0c;优先选择自己的&#xff0c;毕竟熟悉&#xff0c;容易临场发挥&#xff0c;别人的项目没有参与过&#xff0c;无法深有体会。 二、各大期刊网站 包括中国知…

mysql使用datetime,java如何保存

CREATE TABLE user (省略部分代码create_time datetime NOT NULL COMMENT 创建时间省略部分代码)java class User {private Timestamp createTime; }java8 import java.sql.Timestamp;省略部分代码 LocalDateTime now LocalDateTime.now(); // 获取当前日期时间 Timestamp t…

朝花夕拾 - 写在 29

人间一趟&#xff0c;积极向上&#xff01; 乘生日还有个小尾巴&#xff0c;写篇文章结个尾。 一、时间断层 众所周知我是个很喜欢分享的人&#xff0c;所以在 2023 年尾到现在一直没分享&#xff1a; 要么我懒劲犯了要么我真太忙了 罗列下需要补充分享的帖子&#xff1a; 202…

聚道云软件连接器助力企业实现CRM与税票系统对接,提升财务管理效率

一、客户介绍&#xff1a;行业翘楚&#xff0c;寻求数字化升级 某企业作为行业内的佼佼者&#xff0c;始终站在市场前沿&#xff0c;不断探索数字化转型的新路径。近年来&#xff0c;随着业务规模的扩大&#xff0c;该企业对于客户关系管理&#xff08;CRM&#xff09;与税务电…

数据分析python代码——数据填充

在Python中&#xff0c;我们通常使用pandas库来处理和分析数据。数据填充是数据预处理的一个重要步骤&#xff0c;用于处理数据中的缺失值。以下是使用pandas库进行数据填充的示例代码&#xff1a; 在数据分析中&#xff0c;处理缺失值&#xff08;空值&#xff09;是一个重要…

面试经典150题——删除有序数组中的重复项

面试经典150题 day3 题目来源我的题解方法一 双指针 题目来源 力扣每日一题&#xff1b;题序&#xff1a;26 我的题解 方法一 双指针 使用两个指针分别指向相同元素的左右边界&#xff0c;再利用一个count记录最终需要的数组长度。 时间复杂度&#xff1a;O(n) 空间复杂度&a…

AI预测体彩排3第1弹【2024年4月12日预测--第1套算法开始计算第1次测试】

前面经过多个模型几十次对福彩3D的预测&#xff0c;积累了一定的经验&#xff0c;摸索了一些稳定的规律&#xff0c;有很多彩友让我也出一下排列3的预测结果&#xff0c;我认为目前时机已成熟&#xff0c;且由于福彩3D和体彩排列3的玩法完全一样&#xff0c;我认为3D的规律和模…

【竞技宝】LOL:bin卡牌完美牵制 BLG击败TES晋级春决

北京时间2024年4月12日,英雄联盟LPL2024春季季后赛继续进行,昨天迎来四强赛胜者组决赛BLG对阵TES。本场比赛双方前几局有来有回战至2-2平,决胜局bin的上单卡牌中期完美牵制了TES,后期孤身一人偷家成功,最终BLG3-2击败TES晋级春决。以下是本场比赛的详细战报。 第一局: 首局比赛…

第7章、ReactRedux 实战 - 登录注册验证;

一、登录注册认证系统课程介绍&#xff1b; 二、搭建前端环境&#xff1b; 三、搭建后端环境&#xff1b; 四、页面与路由搭建&#xff1b; 五、实现注册页面&#xff1b; 六、使用axios发送请求&#xff1b; 七、后端验证数据&#xff1b; 八、前端显示表单验证错误&am…

数字乡村可视化大数据-DIY拖拽式设计

DIY拖拽式大数据自由设计万村乐可视化大数据V1.0 随着万村乐数字乡村系统的广泛使用&#xff0c;我们也接收到了客户的真实反馈&#xff0c;最终在公司的决定下&#xff0c;我们推出了全新的可视化大数据平台V1.0版本&#xff0c;全新的可视化平台是一个通过拖拽配置生成可视化…

mybatis报错无法update数据

报错信息&#xff1a; org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named null in class com.feishu.commute.pojo.entity.ZzzHrOaQingJia 显示映射的某个属性名字为…

网络流量分析与控制

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计5477字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

爬虫现在还有那么吃香嘛?

Python 作为一种广泛应用的编程语言&#xff0c;在 Web 开发、大数据开发、人工智能开发和嵌入式开发等领域都有着重要的应用。 Python 的易学性、清晰性和可移植性等特点使它得到很多技术人士的喜爱。对于数据科学和机器学习领域的程序员来说&#xff0c;Python 提供了强大的…

YOLOV5 分类:利用yolov5进行图像分类

1、前言 之前介绍了yolov5的目标检测示例,这次将介绍yolov5的分类展示 目标检测:YOLOv5 项目:训练代码和参数详细介绍(train)_yolov5训练代码的详解-CSDN博客 yolov5和其他网络的性能对比 yolov5分类的代码部分在这 2、数据集准备 yolov5分类的数据集就是常规的摆放方式…

原生JS通过XMLHttpRequest请求文件流下载文件时获取文件名称

背景&#xff1a;后台请求文件接口返回的是文件流Stream&#xff0c;可是不知道怎么获取这个文件流文件的名字&#xff1b;在swagger或者postman中请求接口时&#xff0c;文件名称也是乱码 解决 &#xff1a; 1. 使用XMLHttpRequest去请求文件流&#xff0c;并在页面导出 2.…

vue 文件预览

<template><div><p>打开新页面预览文件</p><div v-for"(item,index) in list" :key"index"><el-link type"primary" click"handleOpen(item.url)">{{item.name}}</el-link></div><…

【问题】 STM32 从 BOOT 跳转 APP 后运行失败的解决方案贴搜集

解决贴 关于STM32的BootLoader应用程序后不能正常跳转的问题总结 关于使用STM32F103C8T6的boot升级程序时&#xff0c;跳转到APP一直进入HardFault_Handler的问题解决 IAP升级跳转APP卡死&#xff0c;全网最巧妙解决方案 STM32H7 bootloader 跳转到APP后死机问题 Keil MDK…

rocky9上安装Harbor私有仓库

环境 rocky9 minimal 安装docker 配置阿里云的docker源 yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 指定安装这个版本的docker-ce yum list docker-…