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

embedded/2024/10/18 9:19:03/
  • 👋 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.ppmy.cn/embedded/48852.html

相关文章

算法01 递推算法及相关问题详解【C++实现】

目录 递推的概念 训练&#xff1a;斐波那契数列 解析 参考代码 训练&#xff1a;上台阶 参考代码 训练&#xff1a;信封 解析 参考代码 递推的概念 递推是一种处理问题的重要方法。 递推通过对问题的分析&#xff0c;找到问题相邻项之间的关系&#xff08;递推式&a…

Windows 服务器Nginx 下载、部署、配置流程(图文教程)

不定期更新 目录 一、下载Nginx安装包 二、上传安装包 三、启动Nginx 四、Nginx常用命令 五、Nginx&#xff08;最小&#xff09;配置详解 六、Nginx&#xff08;基础&#xff09;配置详解 七、反向代理 八、负载均衡 九、动静分离 十、报错 一、下载Nginx安装包 四…

从零手写实现 nginx-12-keepalive HTTP 持久连接或连接复用

前言 大家好&#xff0c;我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的&#xff0c;可以参考我的另一个项目&#xff1a; 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …

【AI原理解析】— Meta Llama-3模型

目录 一、模型架构 Transformer架构 解码器&#xff08;Decoder-only&#xff09;设计 Group Query Attention (GQA)技术 二、参数与训练 参数规模 训练数据集 训练过程 三、技术特点 四、性能提升 推理能力 安全性增强 商业与研究用途 五、多语言支持 六、环境…

Pytest 读取excel文件参数化应用

本文是基于Pytest框架&#xff0c;读取excel中的文件&#xff0c;传入页面表单中&#xff0c;并做相应的断言实现。 1、编辑媒体需求 首先明确一下需求&#xff0c;我们需要对媒体的表单数据进行编辑&#xff0c;步骤如下&#xff1a; 具体表单如下图所示 1、登录 2、点击我…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 停车场车位统计(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 停车场车位统计(100分) 🌍 评测功能需要订阅专栏后私信联…

算法:分治(快排)题目练习

目录 题目一&#xff1a;颜色分类 题目二&#xff1a;排序数组 题目三&#xff1a;数组中的第k个最大元素 题目四&#xff1a;库存管理III 题目一&#xff1a;颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地对它们进行排序&#xff0c;…

Mac平台上公认的最好的下载工具Folx Pro 5 for Mac激活码

Folx是什么 Folx Pro 5 for Mac是Mac平台上公认的最好的下载工具&#xff0c;功能可以与迅雷相媲美。 Folx是一款老牌下载神器&#xff0c;可通过URL链接和种子文件下载文件&#xff0c;同时提供了便捷的下载管理和灵活的应用设置&#xff0c;Folx可以对下载的资源进行分类&a…