03-3.5.1~4 特殊矩阵的压缩存储

  • 👋 Hi, I’m @Beast Cheng
  • 👀 I’m interested in photography, hiking, landscape…
  • 🌱 I’m currently learning python, javascript, kotlin…
  • 📫 How to reach me --> 458290771@qq.com

喜欢《数据结构》部分笔记的小伙伴可以订阅专栏,今后还会不断更新。🧑‍💻
此外,《程序员必备技能》专栏日后会逐步更新,感兴趣的小伙伴可以点一下订阅、收藏、关注!🚀
谢谢大家!🙏

数组的存储结构

一维数组

ElemType a[10]; // ElemType型一维数组
起始地址:LOC
各数组元素大小相同物理上连续存放
数组元素a[i]的存放地址 = L O C + i ∗ s i z e o f ( E l e m T y p e ) LOC+i*sizeof(ElemType) LOC+isizeof(ElemType) ( 0 < = i < 10 ) (0 <= i < 10) (0<=i<10)
注:除非题目特别说明,否则数组下标默认从0开始

二维数组

ElemType b[2][4]; // 2行4列的二维数组
起始地址:LOC
M行N列的二维数组b[M][N]

  • 若按行优先存储,则b[i][j]的存储地址 = L O C + ( i ∗ N + j ) ∗ s i z e o f ( E l e m T y p e ) LOC + (i*N+j)*sizeof(ElemType) LOC+(iN+j)sizeof(ElemType)
  • 若按列优先存储,则b[i][j]的存储地址 = L O C + ( i + j ∗ M ) ∗ s i z e o f ( E l e m T y p e ) LOC+(i+j*M)*sizeof(ElemType) LOC+(i+jM)sizeof(ElemType)

特殊矩阵

普通矩阵

∣ a 1 , 1 a 1 , 2 a 1 , 3 . . . . . . a 1 , n − 1 a 1 , n a 2 , 1 a 2 , 2 a 2 , 3 . . . . . . a 2 , n − 1 a 2 , n a 3 , 1 a 3 , 2 a 3 , 3 . . . . . . a 3 , n − 1 a 3 , n ⋮ ⋮ ⋮   ⋮ ⋮ a n , 1 a n , 2 a n , 3 . . . . . . a n , n − 1 a n , n ∣ \begin{vmatrix} a_{1,1}&a_{1,2}&a_{1,3}&......&a_{1,n-1}&a_{1,n}\\ a_{2,1}&a_{2,2}&a_{2,3}&......&a_{2,n-1}&a_{2,n}\\ a_{3,1}&a_{3,2}&a_{3,3}&......&a_{3,n-1}&a_{3,n}\\ \vdots&\vdots&\vdots&\,&\vdots&\vdots\\ a_{n,1}&a_{n,2}&a_{n,3}&......&a_{n,n-1}&a_{n,n}\\ \end{vmatrix} a1,1a2,1a3,1an,1a1,2a2,2a3,2an,2a1,3a2,3a3,3an,3........................a1,n1a2,n1a3,n1an,n1a1,na2,na3,nan,n
可用二位数组存储
注意:描述矩阵元素时,行、列号通常从 1 开始;而描述数组时通常下标从 0 开始(具体看题目给的条件,注意审题)

对称矩阵的压缩存储

若 n 阶方阵中任意一个元素 a i , j a_{i,j} ai,j 都有 a i , j = a j , i a_{i,j}=a_{j,i} ai,j=aj,i ,则称该矩阵为对称矩阵
∣ a 1 , 1 a 1 , 2 a 1 , 3 . . . . . . a 1 , n − 1 a 1 , n a 2 , 1 a 2 , 2 a 2 , 3 . . . . . . a 2 , n − 1 a 2 , n a 3 , 1 a 3 , 2 a 3 , 3 . . . . . . a 3 , n − 1 a 3 , n ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ a n − 1 , 1 a n − 1 , 2 a n − 1 , 3 . . . . . . a n − 1 , n − 1 a n − 1 , n a n , 1 a n , 2 a n , 3 . . . . . . a n , n − 1 a n , n ∣ \begin{vmatrix} a_{1,1}&a_{1,2}&a_{1,3}&......&a_{1,n-1}&a_{1,n}\\ a_{2,1}&a_{2,2}&a_{2,3}&......&a_{2,n-1}&a_{2,n}\\ a_{3,1}&a_{3,2}&a_{3,3}&......&a_{3,n-1}&a_{3,n}\\ \vdots&\vdots&\vdots&\ddots&\vdots&\vdots\\ a_{n-1,1}&a_{n-1,2}&a_{n-1,3}&......&a_{n-1,n-1}&a_{n-1,n}\\ a_{n,1}&a_{n,2}&a_{n,3}&......&a_{n,n-1}&a_{n,n}\\ \end{vmatrix} a1,1a2,1a3,1an1,1an,1a1,2a2,2a3,2an1,2an,2a1,3a2,3a3,3an1,3an,3..............................a1,n1a2,n1a3,n1an1,n1an,n1a1,na2,na3,nan1,nan,n
普通存储: n ∗ n n*n nn 二维数组
压缩存储:只存储主对角线+下三角区

  • 策略:只存储主对角线+下三角区
    行优先原则将各元素存入一维数组中

思考:

  1. 数组大小应该为多少?
    • n ( n + 1 ) 2 \frac{n(n+1)}{2} 2n(n+1)
  2. 站在程序员的角度,对称矩阵压缩存储后怎样才能方便使用?
    • 可以实现一个“映射”函数,矩阵下标->一维数组下标

那么如何才能把矩阵的下标映射为一维数组的下标呢?

  • 关键:按照行优先的原则且 ( i ≥ j ) (i\geq j) (ij) a i , j a_{i,j} ai,j 是数组 B [ k ] B[k] B[k] 中的第几个元素?
    • 根据下标 i ,前面有 i ( i − 1 ) 2 + j \frac{i(i-1)}{2}+j 2i(i1)+j 个元素
    • 所以 k = i ( i − 1 ) 2 + j − 1 k=\frac{i(i-1)}{2}+j-1 k=2i(i1)+j1 (如果有些数组下标从 1 开始,那么就不需要 -1 了
  • 那么如果是 i < j i<j i<j 呢?
    • 根据对称矩阵的性质,我们可以转变为访问 a j , i a_{j,i} aj,i
    • 那么 k = j ( j − 1 ) 2 + i − 1 k=\frac{j(j-1)}{2}+i-1 k=2j(j1)+i1

三角矩阵

下三角矩阵:除了主对角线和下三角区,其余的元素都相同
上三角矩阵:除了主对角线和上三角区,其余的元素都相同
压缩存储策略:按行优先原则将橙色区元素存入一维数组中。并在最后一个位置存储常量 c

  • 如果是下三角矩阵:
    • 三角矩阵的下标映射为一维数组的下标和对称矩阵的一样:
      k = { i ( i − 1 ) 2 + j − 1 ,      i ≥ j    (下三角区和主对角线元素) j ( j − 1 ) 2 + i − 1 ,     i < j     (上三角区元素) k=\begin{cases}\frac{i(i-1)}{2}+j-1,\,\,\,\,i\geq j\,\,(下三角区和主对角线元素)\\ \frac{j(j-1)}{2}+i-1,\,\,\,i<j\,\,\,(上三角区元素)\end{cases} k={2i(i1)+j1,ij(下三角区和主对角线元素)2j(j1)+i1,i<j(上三角区元素)
  • 如果是上三角矩阵:
    k = { ( i − 1 ) ( 2 n − i + 2 ) 2 + ( j − i ) ,      i ≤ j (上三角区和主对角线元素) n ( n + 1 ) 2 ,                                            i > j (下三角区元素) k = \begin{cases}\frac{(i-1)(2n-i+2)}{2}+(j-i),\,\,\,\,i\leq j(上三角区和主对角线元素)\\ \frac{n(n+1)}{2},\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,i>j(下三角区元素)\end{cases} k={2(i1)(2ni+2)+(ji),ij(上三角区和主对角线元素)2n(n+1),i>j(下三角区元素)

三对角矩阵

三对角矩阵,又称带状矩阵
∣ i − j ∣ > 1 |i-j|>1 ij>1 时,有 a i , j = 0    ( 1 ≤ i , j ≤ n ) a_{i,j}=0\,\,(1\leq i,j \leq n) ai,j=0(1i,jn)
也就是说,主对角线上的元素都是非零元素,并且任意一个主对角线上的元素四周的元素都是非零元素再往外的元素都是零元素


按照行优先(或列优先)原则,只存储带状部分
不难发现,前 i − 1 i-1 i1 行共有 3 ( i − 1 ) − 1 3(i-1)-1 3(i1)1 个元素, a i , j a_{i,j} ai,j 应该是第 i 行的第 j − i + 2 j-i+2 ji+2 个元素,所以 a i , j a_{i,j} ai,j 是第 2 i + j − 2 2i+j-2 2i+j2 个元素 --> k = 2 i + j − 3 k=2i+j-3 k=2i+j3


反之,如果已经知道数组下标 k ,如何得到 i,j?
i − 1 i-1 i1 3 ( i − 1 ) − 1 3(i-1)-1 3(i1)1 个元素
i i i 行共 3 i − 1 3i-1 3i1 个元素
显然, 3 ( i − 1 ) − 1 < k + 1 ≤ 3 i − 1 3(i-1)-1<k+1\leq 3i-1 3(i1)1<k+13i1
i = ( k + 2 ) 3 i=\frac{(k+2)}{3} i=3(k+2) ,向上取整,刚好可以满足上面那个表达式

稀疏矩阵

稀疏矩阵:非零元素远远少于矩阵元素的个数
压缩存储策略:

  • 顺序存储——三元组(行,列,值)
  • 链式存储——十字链表法
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最新区块链论文速读--CCF A会议 CCS 2023 共25篇 附pdf下载(3/4)

Conference&#xff1a;ACM Conference on Computer and Communications Security (CCS) CCF level&#xff1a;CCF A Categories&#xff1a;network and information security Year&#xff1a;2023 Num&#xff1a;25 第1~7篇区块链文章请点击此处查看 第8~13篇区块链文…

【介绍下什么是Kubernetes编排系统】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

java线程池介绍

在Java中&#xff0c;线程池是用来管理和复用线程的一种机制&#xff0c;它可以显著提升程序性能&#xff0c;特别是在大量短期异步任务的场景下。以下是创建和使用线程池的基本步骤&#xff1a; 1.创建线程池: 使用java.util.concurrent.Executors类的静态工厂方法创建线程池&…

【c语言】自定义类型----结构体

结构体是c语言的一种自定义类型&#xff0c;自定义类型对于开发者及其重要的类型&#xff0c;它可以随意由开发者进行谱写功能&#xff0c;而今天的结构体可以用来表示一种变量的单个或多种具体属性&#xff0c;再编写代码时有着不可替代的作用&#xff01;&#xff01;&#x…

编译原理-词法分析(实验 C语言)

编译原理-词法分析 1. 实验目的 设计、编写并调试一个词法分析程序&#xff0c;加深对词法分析原理的理解 2. 实验要求 2.1 待分析的简单语言的词法 关键字&#xff1a;begin&#xff0c;if&#xff0c;then&#xff0c;while&#xff0c;do&#xff0c;end 所有关键字都是…

Nginx(openresty) 查看连接数和并发送

1 通过浏览器查看 #修改nginx配置文件 location /status {stub_status on;access_log off;allow 192.168.50.0/24;deny all;} #重新加载 sudo /usr/local/openresty/nginx/sbin/nginx -s reloadActive connections //当前 Nginx 当前处理的活动连接数。 server accepts handl…

HPC: perf入门

如果你想查看你的程序在cpu上运行时&#xff0c;耗时时如何分布的&#xff0c;那么perf是一个合理的选择。 准备工作 为了支持使用perf&#xff0c;首先你要安装相关的库 sudo apt install linux-tools-5.15.0-67-generic此外&#xff0c;因为使用perf进行benchmark&#xf…

四种跨域解决方案

文章目录 1.引出跨域1.基本介绍2.具体演示1.启动之前学习过的springboot-furn项目2.浏览器直接访问 [localhost:8081/furns](http://localhost:8081/furns) 可以显示信息3.启动前端项目&#xff0c;取消请求拦截器&#xff0c;这样设置&#xff0c;就会出现跨域4.跨域原因 2.跨…

linux指令--sed

sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 语法解析 sed [选项] 编辑命令 文件 选项&#xff1a; -n&#xff1a;只显示匹配处理的行-e&#xff1a;执行多个编辑命令时-i&#xff1a;在原文件中进行修改&#xff0c;不输出到屏幕-…

零基础入门学用Arduino 第二部分(一)

重要的内容写在前面&#xff1a; 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后&#xff0c;整体感觉是很好的&#xff0c;如果有条件的可以先学习一些相关课程&#xff0c;学起来会更加轻松&#xff0c;相关课程有数字电路…

系统思考—决策

为‮么什‬模型及‮式公‬通常比人‮决类‬策更有效&#xff1f;究‮是竟‬什么让‮些某‬模型和公‮表式‬现出色&#xff1f;事实上&#xff0c;我‮应们‬该探究的‮人是‬类在决策‮程过‬中的不足。关‮在键‬于人类‮策决‬中存在的“噪声”。尽‮模管‬型或公‮不式‬完…

【JavaScript】内置对象 - 字符串对象 ⑤ ( 判断对象中是否有某个属性 | 统计字符串中每个字符出现的次数 )

文章目录 一、判断对象中是否有某个属性1、获取对象属性2、判定对象是否有某个属性 二、统计字符串中每个字符出现的次数1、算法分析2、代码示例 String 字符串对象参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String 一、判…

【NI国产替代】电池模拟器,快速模拟 3C 产品电池的充放电功能

电池模拟器 快速模拟 3C 产品电池的充放电功能输出灵活可调节的电压/电流内置双向 DC-DC 降压变换器为 3C 产品提供漏电检测 电池模拟器系列包含单节双通道&#xff08;1S&#xff09;、双节双通道&#xff08;2S&#xff09;、三节单通道&#xff08;3S&#xff09;三种规格&…

贪心(不相交的开区间、区间选点、带前导的拼接最小数问题)

目录 1.简单贪心 2.区间贪心 不相交的开区间 1.如何删除&#xff1f; 2.如何比较大小 区间选点问题 3.拼接最小数 1.简单贪心 比如&#xff1a;给你一堆数&#xff0c;你来构成最大的几位数 2.区间贪心 不相交的开区间 思路&#xff1a; 首先&#xff0c;如果有两个…

LeetCode刷题之HOT100之颜色分类

下午好呀&#xff0c;大家&#xff01;昨天估计是喝了假酒&#xff0c;现在没有胃口&#xff0c;喝酒真的没有任何好处。以后尽量避免此活动。今天几乎没睡觉&#xff0c;准备做完这题回宿舍&#xff0c;把电脑也带回去。 1、题目描述 2、逻辑分析 对颜色排序&#xff0c;要求…

数字孪生技术体系和核心能力整理

最近对数字孪生技术进行了跟踪调研学习,整理形成了调研成果,供大家参考。通过学习,发现数字孪生技术的构建过程其实就是数字孪生体的构建与应用过程,数字孪生体的构建是一个体系化的系统工程,数字化转型的最终形态应该就是数实融合互动互联的终极状态。数实融合是每个行业…

自定义类型:结构体+结构体内存对齐+结构体实现位段

结构体内存对齐实现位段 一.结构体1.结构体的声明2.结构体变量成员访问操作符3.结构体传参4.匿名结构体5.结构的自引用 二.结构体内存对齐1.对齐规则2.为什么存在内存对齐&#xff1f;3.修改默认对齐数 三.结构体实现位段1.什么是位段2.位段的内存分配3.位段的跨平台问题4.位段…

flink读取hive写入http接口

目录 0、创建hive数据 1、pom.xml 2、flink代码 3、sink 4、提交任务jar 5、flink-conf.yaml 6、数据接收 flink-1.17.2jdk1.8hive-3.1.3hadoop3.3.6passwordhttp0、创建hive数据 /cluster/hive/bin/beeline !connect jdbc:hive2://ip:10000 create database demo; d…

2024 年最新 Python 基于百度智能云实现短语音识别详细教程

百度智能云语音识别 采用国际领先的流式端到端语音语言一体化建模算法&#xff0c;将语音快速准确识别为文字&#xff0c;支持手机应用语音交互、语音内容分析、机器人对话等场景。百度短语音识别可以将 60 秒以下的音频识别为文字。适用于语音对话、语音控制、语音输入等场景…

HTTP-web服务器

web服务器 web服务器实现了http和相关的tcp连接处理&#xff0c;负责管理web服务器提供的资源&#xff0c;以及对服务器的配置&#xff0c;控制以及拓展等方面的管理 web服务器逻辑实现了http协议&#xff0c;并负责提供web服务器的管理功能&#xff0c;web服务器逻辑和操作系…