【数据结构C/C++】稀疏矩阵的压缩

文章目录

  • 什么是稀疏矩阵?
  • 使用C语实现对稀疏矩阵的压缩
  • 408考研各数据结构C/C++代码(Continually updating)

什么是稀疏矩阵?

稀疏矩阵(Sparse Matrix)是一种矩阵,其中大多数元素都是零。与稠密矩阵相比,稀疏矩阵具有许多零元素,因此存储和处理它们可能会浪费大量的存储空间和计算资源。

为了优化稀疏矩阵的存储和处理,可以采用以下方法:

压缩存储:

  1. 压缩稀疏矩阵(Compressed Sparse Matrix):只存储非零元素及其位置信息,以减少存储空间的使用。通常需要存储非零元素的值、行索引和列索引。
    利用稀疏矩阵的特殊结构:如果稀疏矩阵具有特殊结构(如对角矩阵、三角矩阵、带状矩阵等),可以采用专门的存储方式,只存储非零元素及其特殊结构的相关信息,以进一步减少存储空间。
    稀疏矩阵算法:

  2. 针对稀疏矩阵的特殊算法:一些算法可以针对稀疏矩阵的特性进行优化,以减少计算复杂度。
    避免对零元素进行不必要的操作:在处理稀疏矩阵时,可以跳过零元素,只处理非零元素,以节省计算资源。

  3. 数据结构选择:
    使用适当的数据结构:选择合适的数据结构来表示稀疏矩阵,以便有效地存储和操作。常见的数据结构包括压缩行存储(Compressed Row Storage,CSR)、压缩列存储(Compressed Column Storage,CSC)等。

这里我是用的是第一种方法,也就是遍历稀疏数组,得到所有数据为1的索引,然后进行记录,存放到一个数组,然后将当前数组写入到文件即可。

使用C语实现对稀疏矩阵的压缩

#include <stdio.h>
#include <stdlib.h>// 定义稀疏数组结构
typedef struct {int row;int col;int val;
} SparseArray;int main() {const int ROW = 5;const int COL = 5;int chess[ROW][COL];int sum = 0;// 初始化棋盘for (int i = 0; i < ROW; i++) {for (int j = 0; j < COL; j++) {chess[i][j] = 0;}}// 添加非零元素chess[1][2] = 1;chess[2][3] = 1;// 打印棋盘for (int i = 0; i < ROW; i++) {for (int j = 0; j < COL; j++) {printf("%5d", chess[i][j]);if (chess[i][j] != 0) {sum++;}}printf("\n");}// 创建稀疏数组SparseArray *sparseArr = (SparseArray *)malloc(sizeof(SparseArray) * (sum + 1));sparseArr[0].row = ROW;sparseArr[0].col = COL;sparseArr[0].val = sum;int index = 1;for (int i = 0; i < ROW; i++) {for (int j = 0; j < COL; j++) {if (chess[i][j] != 0) {sparseArr[index].row = i;sparseArr[index].col = j;sparseArr[index].val = chess[i][j];index++;}}}// 将稀疏数组写入文件FILE *file = fopen("sparse_array.txt", "w");if (file == NULL) {perror("Error opening file");return 1;}for (int i = 0; i <= sum; i++) {fprintf(file, "%d %d %d\n", sparseArr[i].row, sparseArr[i].col, sparseArr[i].val);}fclose(file);// 从文件中读取稀疏数组file = fopen("sparse_array.txt", "r");if (file == NULL) {perror("Error opening file");return 1;}int numRows, numCols, numVals;fscanf(file, "%d %d %d", &numRows, &numCols, &numVals);SparseArray *readSparseArr = (SparseArray *)malloc(sizeof(SparseArray) * (numVals + 1));readSparseArr[0].row = numRows;readSparseArr[0].col = numCols;readSparseArr[0].val = numVals;for (int i = 1; i <= numVals; i++) {fscanf(file, "%d %d %d", &readSparseArr[i].row, &readSparseArr[i].col, &readSparseArr[i].val);}fclose(file);// 打印从文件中读取的稀疏数组printf("Sparse Array from File:\n");for (int i = 0; i <= numVals; i++) {printf("%d %d %d\n", readSparseArr[i].row, readSparseArr[i].col, readSparseArr[i].val);}free(sparseArr);free(readSparseArr);return 0;
}

在这里插入图片描述

408考研各数据结构C/C++代码(Continually updating)

408考研各数据结构C/C++代码(Continually updating)
这个模块是我应一些朋友的需求,希望我能开一个专栏,专门提供考研408中各种常用的数据结构的代码,并且希望我附上比较完整的注释以及提供用户输入功能,ok,fine,这个专栏会一直更新,直到我认为没有新的数据结构可以讲解了。
目前我比较熟悉的数据结构如下:
数组、链表、队列、栈、树、B/B+树、红黑树、Hash、图。
所以我会先有空更新出如下几个数据结构的代码,欢迎关注。 当然,在我前两年的博客中,对于链表、哈夫曼树等常用数据结构,我都提供了比较完整的详细的实现以及思路讲解,有兴趣可以去考古。

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

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

相关文章

蓝桥杯 使用sort排序(c++)

sort是一个C已经为我们实现好的工具&#xff0c;当我们要用它时&#xff0c;需要先引入一个算法的库—— < algorithm >。需要说明的是&#xff0c;sort可以排序任何类型的元素&#xff0c;包括我们自己定义的结构体。 我们将需要在C文件的开始位置加上&#xff1a; #in…

C++: 继承

学习目标 1.继承的概念及定义 2.基类和派生类对象赋值转换(切片) 3.继承中的作用域(隐藏/重定义) 4.派生类的默认成员函数 5.继承与友元 6.继承与静态成员 7.菱形继承与菱形虚拟继承 8.总结 1.继承的概念及定义 1.1概念 继承: 它允许你创建一个新的类&#xff08;称为子类或派…

【pytorch】模型的保存与加载|| Dataloader数据加载器

Pytorch模型保存与加载&#xff0c;并在加载的模型基础上继续训练 系统学习Pytorch笔记三&#xff1a;Pytorch数据读取机制(DataLoader)与图像预处理模块(transforms) 一、只保存参数 1. 保存 一般地&#xff0c;采用一条语句即可保存参数&#xff1a; torch.save(model.s…

Docker系列--网络的配置

原文网址&#xff1a;Docker系列--网络的配置_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Docker的网络的配置。 官网网址 https://docs.docker.com/engine/reference/commandline/network/ 网络的默认设置 Docker启动之后&#xff0c;系统中会产生一个名为docker0的…

开发者职场“生存状态”大调研报告分析 - 第一版

听人劝、吃饱饭,奉劝各位小伙伴,不要订阅该文所属专栏。 作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 跨域学习者,从事过全栈研发、产品经理等工作,现任研发部门 CTO 。荣誉:2022年度博客之星Top4、博客专家认证、全栈领域优质创作者、新星计划导师,“星荐官共赢计…

iOS 获取模拟器沙盒路径

xcrun simctl get_app_container booted Bundle Identifier data

C# redis通过stream实现消息队列以及ack机制

redis实现 查看redis版本 redis需要>5.0 Stream 是 Redis 5.0 引入的一种专门为消息队列设计的数据类型&#xff0c;Stream 是一个包含 0 个或者多个元素的有序队列&#xff0c;这些元素根据 ID 的大小进行有序排列。 它实现了大部分消息队列的功能&#xff1a; 消息 ID…

TensorFlow入门(二十、损失函数)

损失函数 损失函数用真实值与预测值的距离指导模型的收敛方向,是网络学习质量的关键。不管是什么样的网络结构,如果使用的损失函数不正确,最终训练出的模型一定是不正确的。常见的两类损失函数为:①均值平方差②交叉熵 均值平方差 均值平方差(Mean Squared Error,MSE),也称&qu…

Vue思考题_01v-for与v-if的优先级谁更高

目录 vue2vue3 官方文档上说不推荐将v-for与v-if在同一个标签上使用&#xff0c;因为两者优先级并不明显。 那么到底是那个指令的优先级比较高呢&#xff1f; 在vue2与vue3中答案是相反的。 vue2 在vue2中将2个指令放在同一个标签上 <template><ul><li v-fo…

Vue3中reactive, onMounted, ref,toRaw,conmpted 使用方法

import { reactive, onMounted, ref,toRaw,conmpted } from vue; vue3中 reactive &#xff0c;ref &#xff0c; toRaw&#xff0c;watch&#xff0c;conmpted 用法 toRaw 返回原响应式对象 用法&#xff1a; const rowList toRaw(row) reactive:ref: ref和reactive都是V…

关于链表指针的深刻理解

以下列代码为例 //终于给我搞清楚指针的指向究竟是怎么看的了// 按编号对职工记录进行递增排序 void sortById(List* list) {Employee* p, * q, * tail NULL;// tail 变量则是一个边界指针&#xff0c;初始值为 NULL。while (list->head->next ! tail) // tail 变量则是…

【通信系列 1 -- GSM 和 LTE】

文章目录 1. LTE(Long Term Evolution)1.1 FDD&TDD简介1.1.1 3G与4G差异1.1.2 频点与band关系1.1.3 band 与运营商的关系 1.2 TDD&FDD区别1.2.1 FDD帧结构1.2.2 TDD帧结构1.2.3 TDD&FDD优势对比1.2.4 TDD缺点 1.3 VoLTE1.3.1 VoLTE 优点11.3.2 VoLTE 优点21.3.3 Vo…

【ARM Coresight 系列文章19 -- Performance Monitoring Unit(性能监测单元)

文章目录 1.1 PMU 介绍1.2 PMU 寄存器1.2.1 PMU 管理寄存器1.2.2 PMU 外设识别寄存器1.2.3 PMU 组件识别寄存器1.3 性能监控事件1.3.1 Cortex-A9 特定事件1.1 PMU 介绍 许多体系结构都包含 PMU(Performance Monitoring Unit)硬件,用于跟踪、计数系统内部的一些底层硬件事件…

MySql运维篇---009:分库分表:垂直拆分、水平拆分、通过MyCat进行分片,读写分离:一主一从、 双主双从

3.分库分表 3.1 介绍 3.1.1 问题分析 使用单个数据库存储所有的数据&#xff0c;如果磁盘和内存和内存不足了可以增大磁盘和内存&#xff0c;但是对于一台服务器的磁盘和内存不可能无限制的扩张下去&#xff0c;它是受我们服务器的硬件影响的&#xff0c;如果说数据库所存储…

mp4音视频分离技术

文章目录 问题描述一、分离MP3二、分离无声音的MP4三、结果 问题描述 MP4视频想拆分成一个MP3音频和一个无声音的MP4文件 一、分离MP3 ffmpeg -i C:\Users\Administrator\Desktop\一个文件夹\我在财神殿里长跪不起_完整版MV.mp4 -vn C:\Users\Administrator\Desktop\一个文件…

机器学习之自训练协同训练

前言 监督学习往往需要大量的标注数据&#xff0c; 而标注数据的成本比较高 &#xff0e; 因此 &#xff0c; 利用大量的无标注数据来提高监督学习的效果有着十分重要的意义&#xff0e; 这种利用少量标注数据和大量无标注数据进行学习的方式称为 半监督学习 &#xff08; Semi…

Java进击框架:Spring-Bean初始化过程(五)

Java进击框架&#xff1a;Spring-Bean初始化过程&#xff08;五&#xff09; 前言源码初始化配置加载Bean加载Bean对象加载Bean切面 Bean工厂后置处理器注册Bean后置处理器初始化消息源初始化应用程序事件多播器注册监听器完成Bean工厂初始化Bean初始化完成刷新应用上下文创建完…

VSCODE+PHP8.2配置踩坑记录

VSCODEPHP8.2配置踩坑记录 – WhiteNights Site 我配置过的最恶心的环境之一&#xff1a;windows上的php。另一个是我centos服务器上的php。 进不了断点 端口配置和xdebug的安装 这个应该是最常见的问题了。从网上下载完php并解压到本地&#xff0c;打开vscode&#xff0c;安装…

【网路安全 --- Linux,window常用命令】网络安全领域,Linux和Windows常用命令,记住这些就够了,收藏起来学习吧!!

一&#xff0c;Linux 1-1 重要文件目录 1-1-1 系统运行级别 /etc/inittab 1-1-2 开机启动配置文件 /etc/rc.local /etc/rc.d/rc[0~6].d## 当我们需要开机启动自己的脚本时&#xff0c;只需要将可执行脚本丢在 /etc/init.d 目录下&#xff0c;然后在 /etc/rc.d/rc*.d 中建…

XLSX.utils.sheet_to_json() 数字格式转为字符串格式

raw 默认为true&#xff0c;设置为false就可以了 XLSX.utils.sheet_to_json(workbook.Sheets[sheet], {raw:false})