矩阵压缩算法

当矩阵中存在着重复元素时,为了节省空间会采用压缩算法,关键在于原矩阵空间与压缩后数据结构的对应;

1.对称压缩:数据沿对角线对称的情况;

将矩阵压缩为一维数组,数组的长度是:

对于num[n][n];

zipNum.size()=(n+1)*n/2;

元素的对应:这是直接针对二维数组来说的,一般的矩阵起始是从1开始的,那会是i(i-1)/2+j-1;

 

 代码如下:

int main() 
{int nums[4][4] = { {3,5,6,8},{5,4,7,9},{6,7,12,10},{8,9,10,13} };zipNums.size()=4*(4+1)/2=10;int zipNums[10] = {0};for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){if (i >= j) { zipNums[i * (i +1) / 2 + j] = nums[i][j]; }else		{ zipNums[j * (j + 1) / 2 + i] = nums[i][j]; }}}for (int i = 0; i < 10; i++){cout << zipNums[i] << " ";}return 0;
}

这是对称矩阵压缩;

上三角矩阵:与对称矩阵一样,但需要一个额外的空间存放常数;

在这里插入图片描述

下三角矩阵:与上三角相反;

稀疏压缩(难点):

如果一个矩阵中的有效元素很少,则应该使用稀疏压缩算法;稀疏矩阵也可以采用十字链表来压缩;

C++ 特殊矩阵的压缩存储算法_问题 a: 特殊的方阵 c++_一枚大果壳的博客-CSDN博客

【数据结构】特殊矩阵的压缩存储|保姆级详解+图解_数据结构图的压缩存储_是瑶瑶子啦的博客-CSDN博客各种特殊矩阵的压缩存储_日事日毕_日清日高的博客-CSDN博客

三元组法即用结构数组记录数的行列号和值;

#define Max 30struct Three{int row;
int col;
int val
}Three,Th[Max];

三元组法:具有顺序存储的缺点,即查找,添加,删除非常困难,因此对于要变动的稀疏矩阵可以采用十字链表进行存储:采用十字链表时需要额外的两个行列的头节点数组来来方便查找;也可以用一个数组来记录,这个数组的结构元素要具有两个指针;

#define MAX 10struct LinkedList
{int row;
int col;
int val;LinkList*next_row;
LinkList*next_col;};typedef struct DOUBLE_XN
{LinkList*head_row;
LinkList*head*col;
}XN,XML[MAX];XML[MAX]就是头节点数组;typedef struct ONE_XN
{LinkList*head;
//LinkList*head*col;
}XN,XM[MAX];XM[MAX]就是单一的数组;

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

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

相关文章

计算机网络之链路层和局域网

六.链路层和局域网 6.1 链路层概述 6.1.1 链路层可能提供的服务 成帧、链路接入、可靠交付、差错检测和纠正 6.1.2 链路层在何处实现 下图是一个典型的主机体系结构&#xff0c;链路层的主体部分是在网络适配器实现的&#xff0c;部分链路层是在运行于主机CPU上的软件实现的…

leetcode:836. 矩形重叠(python3解法)

难度&#xff1a;简单 矩形以列表 [x1, y1, x2, y2] 的形式表示&#xff0c;其中 (x1, y1) 为左下角的坐标&#xff0c;(x2, y2) 是右上角的坐标。矩形的上下边平行于 x 轴&#xff0c;左右边平行于 y 轴。 如果相交的面积为 正 &#xff0c;则称两矩形重叠。需要明确的是&…

解决pyecharts图表在jupyter notebook无法显示的问题

在jupyter notebook尝试制作pyecharts图表&#xff0c;遇到无法显示的问题&#xff0c;网上查到的结果有各种不同原因&#xff0c;此处一一罗列&#xff0c;便于大家排查并彻底解决问题。 情况1&#xff1a;图表完全无法显示 解决方案&#xff1a;参考此文档 注&#xff1a;…

使用vue脚手架搭建前端工程(附:搭配ElementUI来快速开发)

目录 一、搭建过程 1. 全局安装webpack&#xff08;打包工具&#xff09; 2. 全局安装vue脚手架 3. 初始化vue项目 4. vue项目目录的简单介绍 二、执行流程分析 三、自己造一个组件案例 四、ElementUI的使用 1. 环境的引入 2. 一个简单使用 3. 使用它来快速搭建后台管…

四种缓存的避坑总结

背景 分布式、缓存、异步和多线程被称为互联网开发的四大法宝。今天我总结一下项目开发中常接触的四种缓存实际项目中遇到过的问题。 JVM堆内缓存 JVM堆内缓存因为可以避免memcache、redis等集中式缓存网络通信故障问题&#xff0c;目前还在项目中广泛使用。 堆内缓存需要注…

【react全家桶学习】react的 (新/旧) 生命周期(重点)

目录 生命周期&#xff08;旧&#xff09; 挂载时的生命周期 constructor&#xff08;props&#xff09; componentWillMount&#xff08;&#xff09;-------------新生命周期已替换 render&#xff08;&#xff09; componentDidMount&#xff08;&#xff09;--- 组件…

IDEA中删除某个模块后在创建同名模块显示已存在 的解决方案

IDEA中删除某个模块后在创建同名模块显示已存在 的解决方案 出现的问题复现解决方案成功添加后可能会出现的问题 出现的问题复现 前提是你认为已经删干净了&#xff0c;因为删除模块得删除两次才能从本地的文件夹中删除。 解决方案 右击项目名 找到 这个玩意儿&#xff0c;点…

光模块封装类型有哪些?光模块“皮肤”大揭秘

什么是光模块&#xff1f; 光模块&#xff08;Optical Transceiver&#xff09;全称为光收发一体模块&#xff0c;它是光通信中的核心器件&#xff0c;能够完成信号的光-电/电-光转换过程&#xff0c;它由光电子器件、功能电路和光接口等部件组成&#xff0c;其中的光电子器件…

【无线传感器】使用 MATLAB和 XBee连续监控温度传感器无线网络研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

springDatajpa动态sql根据时间范围将数据导出为excel并使用vue的按钮去触发

用到的技术点&#xff1a; 1.springDatajpa 2.EasyExcel 3.数据库 4.vue 前端实现&#xff1a; 1.创建按钮&#xff08;点击此按钮弹出填写导出条件的弹出框&#xff09; <el-button type"primary" round click"dialogVisible true"><svg-icon …

vscode配置终端默认为git bash

vscode配置终端默认为git bash 文章目录 vscode配置终端默认为git bashctrl shift p 打开设置添加 git bash 并设为默认终端 ctrl shift p 打开设置 添加 git bash 并设为默认终端 注意不要配置 git-bash.exe 的路径。 如果配置为 git-bash.exe 路径&#xff0c;则会单独打…

nodejs+mysql+vue+elementUI 实现选择资源管理工具

我们在写后台管理系统时会遇到上传视频、音频等内容。如果上传资源地方多的话,每个地方都要加上传的代码,比较麻烦。而且遇到有些图片是已经上传过的,下次遇到了又要重复上传,浪费服务器或cos资源。 这时候可以实现一个资源管理工具,上传图片到资源管理工具里,然后再去选…