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

news2024/11/16 7:19:21

文章目录

  • 什么是稀疏矩阵?
  • 使用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.coloradmin.cn/o/1073819.html

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

相关文章

Floorplanning with Graph Attention

Floorplanning with Graph Attention DAC ’22 目录 Floorplanning with Graph Attention摘要1.简介2.相关工作3.问题公式化4. FLORA的方法4.1 解决方案概述4.2 C-谱聚类算法 4.3 基于GAT的模型4.4 合成训练数据集生成 摘要 布图规划一直是一个关键的物理设计任务&#xff0…

mac(M1)安装anaconda3

首先下载 然后正常安装即可&#xff0c;之所以我现在测试了anaconda,因为我发现miniconda后&#xff0c;jupyter notebook的安装就出现问题&#xff0c;所以就直接卸载miniconda&#xff0c;而直接安装anaconda了 (base) yxkbogon ~ % pip list Package …

算法通过村第十三关-术数|白银笔记|术数高频问题

文章目录 前言数组实现加法专题数组实现整数加法字符串加法二进制加法 幂运算专题求2的次幂求3的次幂求4的次幂 总结 前言 提示&#xff1a;人心本易趋死寂&#xff0c;苦难之后&#xff0c;焕然重建&#xff0c;激荡一阵&#xff0c;又趋麻木。 --苏枕书《有鹿来》 我们继续看…

连续子数组的最大和

这其实用到的是一个dp的动态规划数组来描写的。 用两个变量就能解决了&#xff0c;一个是max(记录前i个数中子数组的最大的和), 一个是sum是记录前i个数组的和最大值和自己去比较&#xff0c;就是前i-1个和是8&#xff0c;自己是-2&#xff0c; 8 - 2 > -2&#xff0c;所以…

Qt内置的图标与图标字体库加载应用实例(内置图标与加载外置的图标字体库)

一、前言 当涉及到创建应用程序的图形用户界面(GUI)时,图标是不可或缺的一部分。Qt作为一个流行的跨平台开发框架,不仅提供了丰富的UI组件和功能,还内置了许多精美的图标供开发者使用。这些内置图标提供了一种简便的方式,使开发者可以在应用程序中轻松地添加各种图标,提…

科技云报道:联络中心效能与体验齐飞,容联云AICC是如何做到的?

科技云报道原创。 AI与大模型为千行万业带来的进化与改造&#xff0c;远比想象来得更加猛烈。作为数字化升级改造的核心场景之一&#xff0c;联络中心在AI与大模型加持下&#xff0c;正在从基础云通讯迈入智能化的3.0时代。 身处行业智能化浪潮之中&#xff0c;容联云AICC作为…

【Linux】冯诺依曼体系结构初识操作系统

文章目录 1. 冯诺依曼体系结构2. 初识操作系统2.1 操作系统是什么&#xff1f;2. 为什么要有操作系统3. 操作系统是怎么管理的4. 系统调用&#xff08;System Call&#xff09; 1. 冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服…

qml入门

window import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.5Window { //root控件&#xff0c;父窗口是主界面width: 640height: 480visible: true//相对于父控件的偏移量x: 100y:100minimumWidth: 400 //最小宽度minimumHeight: 300 //最小高度ma…

浏览器安装vue调试工具

下载扩展程序文件 下载链接&#xff1a;链接: 下载连接网盘地址&#xff0c; 提取码: 0u46&#xff0c;里面有两个crx,一个适用于vue2&#xff0c;一个适用于vue3&#xff0c;可根据vue版本选择不同的调试工具 crx安装扩展程序不成功&#xff0c;将文件改为rar文件然后解压 安装…

Jenkins 构建时动态获取参数

文章目录 问题简介Groovy 脚本配置进阶 问题 在做jenkins项目时&#xff0c;有些参数不是固定写死的&#xff0c;而是动态变化的&#xff0c;这时我们可以用 Active Choices 插件来远程调用参数 问题解决方案&#xff1a;执行构建前使用Groovy Scrip调用本地脚本&#xff0c;…

Wlan——无线反制理论与配置讲解

目录 非法设备基本概念 非法设备的分类 如何识别非法设备的类型 非法设备判断流程 反制AP的工作模式 AP对于非法设备的检测模式 AP对于非法设备的反制模式 反制设备的工作原理 反制设备如何获取非法设备的信息 反制设备对非法设备反制的原理 如何通过空口抓包判断是…

iframe框架token失效重新登陆问题

在登录信息过期之后&#xff0c;或者也就是token过期后&#xff0c;要登出&#xff0c;跳转到登录页面重新登录来获取token等信息。 这时如果你用的是iframe框架的话&#xff0c;就会出现登录界面是嵌套在框架里面的情况&#xff0c;或者出现下图所示报错情况。 出现这种情况…

PowerBI 一些基础功能

1、PowerBI创建日期表 1.1、Power BI 日期表 - 知乎日期是做数据分析的时候使用最频繁的分析维度&#xff0c;一般建议建立单独的日期维度表&#xff0c;并与事实表的日期字段建立连接。 建立日期维度表可通过DAX函数的方式进行&#xff1a; 日期表 CALENDAR(DATE("2023&…

基于Springboot实现疫情网课管理系统项目【项目源码+论文说明】

基于Springboot实现疫情网课管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于疫情网课管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了疫情…

当我们谈论量化时,我们在谈论什么?量化投资常见策略有哪些?| 融券T0和高频交易详解【邢不行】

最近关于量化的争议不断&#xff0c;很多人甚至建议取缔量化。 部分人认为量化以高频交易配合融券变相实现T0&#xff0c;赚走了市场所有的钱&#xff0c;有失公正。 高频交易大家都听过&#xff0c;即凭借程序在几秒甚至几毫秒内完成一笔交易&#xff0c;有人认为这对还在盯盘…

ThreadLocal线程变量使用浅解

一、概述    ThreadLocal一般称为线程本地变量&#xff0c;它是一种特殊的线程绑定机制&#xff0c;将变量与线程绑定在一起&#xff0c;为每一个线程维护一个独立的变量副本。通过ThreadLocal可以将对象的可见范围限制在同一个线程内&#xff0c; 在实际多线程操作的时候&a…

探索8个顶级的绘图工具

在数字时代&#xff0c;绘画已经成为一种常见的表达方式&#xff0c;不仅广泛应用于艺术创作领域&#xff0c;而且在教育、设计和商业领域发挥着重要作用。随着技术的进步&#xff0c;越来越多的计算机绘图软件出现&#xff0c;为用户提供了更多的选择。本文将推荐8个计算机绘图…

Linux文件与目录的增删改查

一、增 1、mkdir命令 作用: 创建一个新目录。格式: mkdir [选项] 要创建的目录 常用参数: -p:创建目录结构中指定的每一个目录,如果目录不存在则创建,如果目录已存在也不会被覆盖。用法示例: 1、mkdir directory:创建单个目录 这个命令会在当前目录下创建一个名为…

ELK 处理 SpringCloud 日志

在排查线上异常的过程中&#xff0c;查询日志总是必不可缺的一部分。现今大多采用的微服务架构&#xff0c;日志被分散在不同的机器上&#xff0c;使得日志的查询变得异常困难。工欲善其事&#xff0c;必先利其器。如果此时有一个统一的实时日志分析平台&#xff0c;那可谓是雪…

【python】exec()内置函数释义

【python】exec内置函数释义 官方释义样例注意事项拓展感谢及参考博文 官方释义 官方Python API文档镇楼 exec(object, globalsNone, localsNone, /, *, closureNone) 支持动态执行 Python 代码&#xff0c; object 必须是字符串或者代码对象。 需要特别注意以下两点&#xff…