数据结构(3.9_1)——特殊矩阵的压缩存储

总览

一维数组的存储结构 

如果下标从1开始,则a[i]的存放地址=LOC +(i-1)*sizeof(ElemType); 

 二维数组的存储

二维数组也具有随机存储的特性

设起始地址为LOC 

在M行N列的二维数组b[M][N]中,若按行优先存储,

b[i][j]的存储地址的=LOC + (i*N+j) * sizeof(ElemType)

在M行N列的二维数组b[M][N]中,若按列优先存储,

b[i][j]的存储地址的=LOC + (j*N+i) * sizeof(ElemType)

行优先存储的优点:可以随机存储、

列优先存储

普通矩阵的存储

对普通矩阵存储我们可以采用二维数组存储

  1. 行优先存储(大多数编程语言,如 C/C++、Java、Python):

    position=i*n+j

  2. 列优先存储(某些语言和库,如 Fortran):

    position=j*m+i

普通矩阵的存储通常涉及到计算机内存中的数据结构。在大多数编程语言中,矩阵通常被实现为一维数组或者二维数组。

  1. 一维数组存储:在这种方法中,矩阵被 flatten 成一个一维数组。例如,一个 2x3 的矩阵:


    \begin{bmatrix} 1&2 &3 \\ 4&5 &6 \end{bmatrix}

  2. 可以被存储为一个一维数组 [1, 2, 3, 4, 5, 6]。在内存中,这个数组是连续存储的。要访问矩阵中的元素,需要通过特定的公式来计算其在数组中的位置。例如,要访问元素 (i, j),在列优先存储(Column-major order)中,其在一维数组中的位置是 i + j * rows;在行优先存储(Row-major order)中,其位置是 i * cols + j

  3. 二维数组存储:在这种方法中,矩阵被存储为一个二维数组。在大多数编程语言中,这通常是通过数组的数组或者动态分配的二维数组来实现的。例如,在 C 语言中,可以使用 int matrix[2][3] 来声明一个 2x3 的矩阵。在内存中,这个二维数组同样是连续存储的,但是以行或列的顺序。

每种存储方法都有其优缺点。一维数组存储更节省空间,因为不需要存储额外的行或列的指针信息,但是在访问特定元素时可能需要更多的计算。二维数组存储在访问元素时更直观,但是在某些编程语言中可能需要更多的内存来存储额外的指针信息。

对称矩阵的压缩存储

若n阶方阵中任意一个元素都\alpha i,j\alpha i,j=\alpha j,i,则该矩阵为对称矩阵

策略:只存储主队角线+下三角区

行优先原则将各元素存入一维数组中

数组大小应该设置为(1+n)*n/2 ,简而言之就是一个等差数列求和

,问题:对称矩阵压缩存储后该怎么样才能方便使用?

可以实现一个“映射”函数

矩阵下标—>一维数组下标

i>j(下三角)时

下标为0,从第0行开始元素个数有1个第二行元素个数2个....到最后一行有n个,所以它的元素总数为个,所以我们设置的一维数组大小应该就这么大,然后求aij在一维数组的坐标我们应该算出aij是第几个元素,按照行优先的原则,我们先得出aij前面有多少行,第一行为1,然后最后一行是i-1本身,为什么要-1呢?因为下标是从0开始的,所以转换成一维数组后需要减1如果下标从1开始则bu'xu'y,求出等差数列和为\frac{i\cdot (i-1))}{2},注意这里i-1才是项数,i是首项加末项由i-1+1得来,然后再算出aij前面有多少列元素,根据推导可得有j个元素,所以k=\frac{i\cdot(i-1))}{2}+j-1,这里-1原理同上

i<j(上三角)时

由于对称矩阵aij=aji ,所以k=\frac{j\cdot(j-1))}{2}ij-1

出题思路:

下标从0开始,先求aij前面有多少列元素,第一列是n元素,第二列n-1一值到最后一列n-(j-1-1),为什么要加1呢?因为,我们求的是i-1,i-1有n-(j-1-1)个元素,接下来再求行元素,根据图不难发现,求行元素只需将i-j便可求出除该元素之外本行有多少行元素,因为下标从0开始,所以最后再加上1得出坐标为k=\frac{i\cdot(i-j+3)}{2}+(i-j)+1

三角矩阵的压缩存储

下三角矩阵:

除了主对角线和下三角区,其余的元素都相同

 压缩存储策略:按行优先原则将橙色区元素存入一维数组中。并在最后一个位置存储常量c

映射规律下三角区的规律和对称矩阵的相同,只是访问上三角区的时候我们需要把下标映射到一维数组的最后一个位置

上三角矩阵:

除了主对角线和上三角区,其余的元素都相同 

压缩存储策略:按行优先原则将绿色区元素存入一维数组中。并在最后一个位置存储常量c 

 首先我们确定aij前面有多少行,所以我们需要知道i-1行,第一行是n个,第二行n-1个,所以第n行有n-(i-1),所以第i-1行是n-(i-1-1)=n-i+2,等差数列求和:(\frac{(i-1)\cdot(2n-i+2))}{2})得知i前面有个(\frac{(i-1)\cdot(2n-i+2))}{2})元素,我们再来计算j前面有多少列元素,就是j-i,得知j前面有j-i个元素,于是我们得知aij是第(\frac{(i-1)\cdot(2n-i+2))}{2})+j-(i-1)-1个元素,最后-1是因为下标从0开始

三对角矩阵的压缩策略

三对角矩阵是一种特殊的带状矩阵,它在矩阵中只有主对角线、主对角线上方的一条对角线和主对角线下方的一条对角线上的元素是非零的,而其他位置的元素都是零。这种矩阵在数值分析中非常常见,尤其是在求解线性方程组时。

 三对角矩阵:当|i-j|>1时,有aij=0 (1<=i,j<=n)

压缩策略:按行优先(或列优先原则,只存储带状部分)

由三队角矩阵可见除第一行和最后一行元素是两个以外其它行元素都是3个所以元素总数是3n-2如果默认下标是0开始,那么最后一个数组的下标则是3n-3

将行号和列号映射为一维数组下标

key:按行优先的原则,aij是第几个元素 

求行:前i-1行共有3(i-1)-1个元素

求列:aij是i行第j-i+2个元素(看图推理得出)

求一维数组下标:行列元素相加得k=2i+j-2,若数组下标从0开始,则k=2i+j-3

已知k求aij

 

求B[k]转换成aij的坐标,首先由于k是数组下标是从0开始的,而题目要求k+1则是从1开始

前i-1行共3(i-1)-1个元素,前i行共有 3i-1

所以得出:3(i-1)-1<k+1\leq 3i-1

可以理解为i刚好大于等于(k+2)/3 : i\geq \frac{k+2}{3}向上取整即可满足"刚好"大于等于:i=\frac{k+2}{3}

稀疏矩阵的压缩存储

稀疏矩阵:非零元素远远少于矩阵元素的个数

压缩存储策略1:

顺序存储---三元组<行,列,值>

压缩存储策略2:

链式存储---十字链表法

总结:

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

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

相关文章

百度2025校园招聘内推开始啦

百度2025校园招聘内推开始啦&#xff0c;快来投递你心仪的职位吧&#xff08; 网申链接地址&#xff1a;https://talent.baidu.com/jobs/list?recommendCodeIZB4S3&recruitTypeGRADUATE &#xff09;填入内推码&#xff0c;完成投递&#xff0c;get内推绿色通道~我的内推码…

ASP.NET Core中创建中间件的几种方式

前言 今天我们一起来盘点一下在ASP.NET Core应用程序中添加和创建中间件常见的四种方式。 中间件介绍 ASP.NET Core中间件&#xff08;Middleware&#xff09;是用于处理HTTP请求和响应的组件&#xff0c;它们被安排在请求处理管道中&#xff0c;并按顺序执行。中间件的设计是为…

ES 慢上游响应问题优化在用户体验场景中的实践

在抖音亿级日活流量的情况下&#xff0c;每天收到的用户反馈也是大量的&#xff0c;而用户反馈对于产品的发展与未来是至关重要的&#xff0c;因此用户体验管理平台&#xff08;简称VoC&#xff09;就应运而生&#xff0c;VoC 平台旨在通过技术平台化的方式&#xff0c;结合反馈…

uni-app 保存号码到通讯录

1、 添加模块 2、添加权限 3、添加策略 Android&#xff1a; "permissionExternalStorage" : {"request" : "none","prompt" : "应用保存运行状态等信息&#xff0c;需要获取读写手机存储&#xff08;系统提示为访问设备上的照片…

房屋出租管理系统小程序需求分析及功能介绍

房屋租赁管理系统适用于写字楼、办公楼、厂区、园区、商城、公寓等商办商业不动产的租赁管理及租赁营销&#xff1b;提供资产管理&#xff0c;合同管理&#xff0c;租赁管理&#xff0c; 物业管理&#xff0c;门禁管理等一体化的运营管理平台&#xff0c;提高项目方管理运营效率…

电脑如何快速删除相同的文件?分享5款重复文件删除工具

您有没有发现最近电脑运行速度变慢了&#xff1f;启动时间变得更长&#xff0c;甚至完成简单任务也难以如常&#xff1f;这可能是因为重复文件堆积所致。我们发现&#xff0c;清理或移动这些重复的文件和文件夹可以产生惊人的效果。通过删除不必要的重复文件和垃圾文件&#xf…

从LeetCode215看排序算法

目录 LeetCode215 数组的第K个最大元素 ① 第一反应&#xff1a;java的内置排序Arrays.sort() ② 冒泡排序 ③归并排序&#xff08;先分解再合并&#xff09; ④快速排序&#xff08;边分解边排序&#xff09; ⑤堆排序 LeetCode215 数组的第K个最大元素 给定整数数组 nums…

ubuntu基于cmakelist的Qt工程,如何将图片打包进二进制程序

qt界面使用的图片打包进入二进制可执行程序&#xff0c;可以避免发布的软件&#xff0c;因为路径问题无法加载图片的问题。 以下步骤参考自百度AI. 步骤如下&#xff1a; 1.创建一个新的Qt资源文件&#xff08;.qrc文件&#xff09; 2.在*.qrc文件中添加图片路径 qrc文件使用…

LeetCode HOT100(四)字串

和为 K 的子数组&#xff08;mid&#xff09; 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2 解法1&#xff1a;前缀和Map 这…

(Vue+SpringBoot+elementUi+WangEditer)仿论坛项目

项目使用到的技术与库 1.前端 Vue2 elementUi Cookie WangEditer 2.后端 SpringBoot Mybatis-Plus 3.数据库 MySql 一、效果展示 1.1主页效果&#xff1a; 1.2 文章编辑页面&#xff1a; 1.3 成功发布文章 1.4 文章关键字搜索提示 1.5 文章查询结果展示 1.6 文章内容及交互展示…

linux怎么查看系统重启原因?LINUX系统不明原因重启解决步骤,在Linux中如何排查系统启动问题?

linux怎么查看系统重启原因&#xff1f;LINUX系统不明原因重启解决步骤&#xff0c;在Linux中如何排查系统启动问题&#xff1f; linux怎么查看系统重启原因&#xff0c;网上大部分总结的步骤如下&#xff1a; 查看系统日志&#xff1a;系统日志中存储了系统重启异常的情况及其…

TransT: 基于类型的多重嵌入表示用于知识图谱补全

1 引言 1.1 问题 仅仅依赖于三元组的结构化信息有其局限性&#xff0c;因为它们往往忽略了知识图谱中丰富的语义信息以及由这些语义信息所代表的先验知识。语义信息是指实体和关系的含义&#xff0c;比如“北京”是“中国”的首都&#xff0c;“苹果”是一种水果。先验知识则…

ESP32CAM物联网教学12

ESP32CAM物联网教学12 MicroPython 视频服务 小智希望能在MicroPython中实现摄像头的视频服务&#xff0c;就像官方示例程序CameraWebServer那样。 下载视频服务驱动库 小智通过上网搜索&#xff0c;发现相关的教学材料还不少&#xff0c;并且知道有人已经写出了视频服务的驱…

24/7/12总结

axios Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 get请求: <script>function…

【Linux网络】数据链路层【下】{MAC/MTU/ARP/ICMP/NAT/PING/代理服务器原理}

文章目录 1.逐步深入数据链路层1.1MAC帧1.2由集线器到交换机1.3认识MTU 2.ARP 地址解析协议/RARP逆地址解析协议3.DNS(Domain Name System)域名从输入url后到能看到网页 发生了什么【典中典】 4.ICMP协议&#xff1a;一个网络层协议有了TCP&#xff0c;为什么还要用ICMPICMP协议…

HSP_15章 Python_模板设计模式和oop进阶总结

P136 模板设计模式 1. 设计模式简介 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式 设计模式就像是经典的棋谱&#xff0c;不同的棋局&#xff0c;我们用不同的棋谱&#xff0c;免去我们自己再思考和摸索 2. 模板设计模式 基本…

【面试八股总结】单例模式实现详解

一、基本概念 单例设计模式是⼀种确保⼀个类只有⼀个实例&#xff0c;并提供⼀个全局访问点来访问该实例的创建模式。 关键概念&#xff1a; 一个私有构造函数&#xff1a;确保只能单例类自己创建实例一个私有静态变量&#xff1a;确保只有一个实例&#xff0c;私有静态变量用…

4-4 词嵌入技术(word2vec)

4-4 词嵌入技术&#xff08;word2vec&#xff09; 词嵌入技术&#xff08;word2vec&#xff09;是自然语言处理&#xff08;NLP&#xff09;中的一种关键技术&#xff0c;通过将词语映射到低维向量空间中&#xff0c;使得计算机能够理解和处理语言中的语义信息。词嵌入不仅可以…

【性能测试】第一节.性能测试基础

文章目录 前言一、性能测试概述二、常见的性能测试指标 2.1 并发 2.2 响应时间 2.3 事务 2.4 点击率 2.5 吞吐量 2.6 资源利用率三、性能测试的分类 3.1 一般性能测试 3.2 负载测试 3.3 压力测试 3.4 稳定性测试总结 前言 一…

CAS详解

文章目录 CAS使用示例Unsafe类实现原理CAS问题 CAS CAS全称为Compare and Swap被译为比较并交换&#xff0c;是一种无锁算法。用于实现并发编程中的原子操作。CAS操作检查某个变量是否与预期的值相同&#xff0c;如果相同则将其更新为新值。CAS操作是原子的&#xff0c;这意味…