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

news2024/11/24 20:05:11
  • 👋 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.coloradmin.cn/o/1813357.html

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

相关文章

vue elementui 自定义loading显示的icon 文本 背景颜色

<div v-loading"modalLoading"element-loading-text"拼命加载中"element-loading-spinner"el-icon-loading"element-loading-background"rgba(0, 0, 0, 0.8)" class"loading-box" v-if"modalLoading"></…

由于人工智能,他们的语言更容易理解

密歇根大学、墨西哥国家天体物理研究所和光学与电子研究所的研究人员正在使用人工智能模型来破译狗的语言。 在国际会议上提出的新研究展示了先进的人工智能 模型如何帮助人类了解动物。 密歇根大学人工智能实验室主任 Rada Mihalcea 强调了这项研究的重要性&#xff1a;对于…

初出茅庐的小李博客之CJSON库解析心知天气数据

心知天气数据JSON格式介绍 JSON格式介绍http://t.csdnimg.cn/pJX1n 下面代码是利用CJSON库进行数据解析 解析代码 #include <stdio.h> #include <string.h> #include "cJSON.h" // 假设你的CJSON库头文件路径是正确的int main(void) {// 提供的JSON…

微软如何打造数字零售力航母系列科普13 - Prime Focus Technologies在NAB 2024上推出CLEAR®对话人工智能联合试点

Prime Focus Technologies在NAB 2024上推出CLEAR对话人工智能联合试点 彻底改变您与内容的互动方式&#xff0c;从内容的创建到分发 洛杉矶&#xff0c;2024年4月9日/PRNewswire/-媒体和娱乐&#xff08;M&E&#xff09;行业人工智能技术解决方案的先驱Prime Focus Techn…

23种设计模式之代理模式

代理模式 1、概念 代理模式&#xff1a;给某一个对象提供一个代理或占位符&#xff0c;并由代理对象来控制对原对象的访问 代理模式是常用的结构型设计模式之一&#xff0c;在Java RMI、Web Service、Spring AOP等技术和框架中都使用了代理模式 2、代理模式结构 Subject&a…

[工具探索]英寸vs毫米下常见尺寸排版

文章目录 常见尺寸1. 照片尺寸2. 纸张尺寸3. 显示器和电视屏幕尺寸4. 手机屏幕尺寸5. 笔记本电脑屏幕尺寸6. 其他设备尺寸 换算公式换算方法常见照片尺寸对比表国际标准ISO&#xff08;216&#xff09;纸张尺寸 什么是英寸&#xff1f; 英寸&#xff08;英语&#xff1a;inch&a…

R语言统计分析——图形参数

参考资料&#xff1a;R语言实战【第2版】 我们可以通过修改图形参数来自定义一幅图形的多个特征&#xff08;字体、颜色、坐标轴、标签&#xff09;。一种方法是通过函数par()来指定这些参数&#xff0c;以这种方式设定的参数除非被再次修改&#xff0c;否则将会在会话结束前一…

webshell三巨头 综合分析(蚁剑,冰蝎,哥斯拉)

考点: 蚁剑,冰蝎,哥斯拉流量解密 存在3个shell 过滤器 http.request.full_uri contains "shell1.php" or http.response_for.uri contains "shell1.php" POST请求存在明文传输 ant 一般蚁剑执行命令 用垃圾字符在最开头填充 去掉垃圾字符直到可以正常bas…

网页五子棋对战项目测试(selenium+Junit5)

目录 网页五子棋对战项目介绍 网页五子棋对战测试的思维导图​ 网页五子棋对战的UI自动化测试 测试一&#xff1a;测试注册界面 测试二&#xff1a;测试登陆界面 测试三&#xff1a;测试游戏大厅界面 测试四&#xff1a;测试游戏房间界面以及观战房间界面 测试五&#…

对yoloV8进行标签过滤来实现行人检测

前言 上一章我们介绍的通过迁移学习&#xff0c;在新的行人数据集上使用已经学习到的特征和权重&#xff0c;从而更快地实现行人检测任务。模型就会调整其参数以适应新的数据集&#xff0c;以提高对行人的识别性能。接下来介绍一种更快更便捷的方法&#xff0c;依旧是基于yolo…

探寻性能优化:如何衡量?如何决策?

目录 一、衡量指标说明 &#xff08;一&#xff09;响应时间&#xff08;Response Time&#xff09; 平均响应时间&#xff08;Average Response Time&#xff09; 百分位数响应时间&#xff08;Percentile Response Time&#xff09; &#xff08;二&#xff09;吞吐量&a…

bugku--web---baby lfi

1、题目描述 2、页面提示使用language参数 3、构造url:/?languagefr。页面有回显 4、这里提示包含关键的文件 5、构造url:/?language/etc/passwd 6、flag shellmates{10CA1_F11e_1Nc1US10n_m4y_r3ve4l_in7Er3st1nG_iNf0Rm4t1on}

2024.6.11

思维导图 代码 #include <iostream>using namespace std;//封装一个 讲解员 类 class Animal { public:Animal(){}virtual void perform(){cout << " " << endl;} };//封装一个 狮子 类 class Lion:public Animal { public:Lion(){}void pe…

BT音频方案

一、缩写 缩写 全程 释义 I2S I2S 音频传输接口总线 PCM Pulse-Code Modulation 基础音频数据或翻译为音频接口总线 HFP Handsfree 蓝牙通话协议 A2DP Advanced Audio Distribution Profile 蓝牙媒体音频协议 二、音频流转策略 蓝牙音频功能分为通话声音和媒体…

【Java】 如何设计RPC框架在10万QPS下实现毫秒级的服务调用?

一、问题解析 来思考这样一个场景&#xff1a;你的垂直电商系统的 QPS 已经达到了每秒 2 万次&#xff0c;在做了服务化拆分之后&#xff0c;由于我们把业务逻辑都拆分到了单独部署的服务中&#xff0c;那么假设你在完成一次完整的请求时需要调用 4&#xff5e;5 次服务&#…

温泉镇旅游微信小程序的设计与实现(论文+源码)_kaic

摘要 旅游业随着经济的快速发展呈现出一派欣欣向荣的景象&#xff0c;尤其是近两年来&#xff0c;各个行业运用科技以及因特网来促进旅游迅速发展&#xff0c;逐渐都显示出了的问题&#xff0c;特别突出的是在线上推广&#xff0c;其缺点也是特别明显。尽管在新冠肺炎的冲击下&…

5252DE 5G 外场通信测试仪

5252DE 5G 外场通信测试仪 集先进算法和高性能硬件于一体的便携式测试仪表 产品综述 5252DE 5G 外场通信测试仪是集合高性能频谱处理模块、多制式解析算法软件于一体的手持式测试仪表&#xff0c;具有很好的便携性、兼容性与可拓展性。 5252DE 具有工作频段宽、性能指标高…

如何分割3D模型

拆分 3D 模型进行打印可以解决许多问题。 你可以使用较小的 3D 打印机打印大型零件&#xff0c;你的零件不会出现太多翘曲&#xff0c;并且零件在清洁和后处理过程中更容易处理。 当然&#xff0c;你需要在打印后将 3D 打印部件粘合在一起&#xff0c;但对于那些无法使用大型 …

C语言 指针——字符数组与字符指针:字符串的输入和输出

目录 逐个字符输入输出字符串 整体输入输出字符串 用scanf输入/输出字符串 用gets输入/输出字符串 用scanf输入/输出字符串 用gets输入/输出字符串 逐个字符输入输出字符串 #define STR_LEN 80 char str[STR_LEN 1 ]; 整体输入输出字符串 用scanf输入/输出字符串 用gets…

拼房、行程变更、跨月退改?复杂场景对账结算怎么办?

在实际商业场景中&#xff0c;销售渠道多样化、数据关联多方、场景多元化、业务逻辑多变性等都让对账成为一门“技术活”&#xff0c;也成为财务人员面前的“拦路虎”。尤其当面临多成本中心、跨项目和跨月退改的出差费用时。手动拆分费用、协调沟通、以及处理费用归属等问题&a…