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.mzph.cn/news/850234.shtml

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

相关文章

HarmonyOS(二十三)——HTTP请求实战一个可切换的头条列表

在前一篇文章&#xff0c;我们已经知道如何实现一个http请求的完整流程&#xff0c;今天就用官方列子实战一个简单的新闻列表。进一步掌握ArkTS的声明式开发范式&#xff0c;数据请求&#xff0c;常用系统组件以及touch事件的使用。 主要包含以下功能&#xff1a; 数据请求。…

Spark 性能调优——分布式计算

前言 分布式计算的精髓&#xff0c;在于如何把抽象的计算流图&#xff0c;转化为实实在在的分布式计算任务&#xff0c;然后以并行计算的方式交付执行。今天这一讲&#xff0c;我们就来聊一聊&#xff0c;Spark 是如何实现分布式计算的。分布式计算的实现&#xff0c;离不开两个…

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

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

【kubernetes】k8s集群中的ingress(对外服务)规则详解

目录 一、Ingress 简介 1.1service的作用 1.2外部访问方案 (四种&#xff09;&#x1f339;&#x1f339;&#x1f339; 部署externalIPs 1.3Ingress 是什么 二、Ingress 组成&#x1f339;&#x1f339;&#x1f339; 三、Ingress 工作原理&#x1f431;&#x1f…

STM32F103C8T6基于HAL库完成uC/OS-III多任务程序

一、在STM32CubeMX中建立工程 配置RCC 配置SYS 配置PC13为GPIO_Output 配置USART1 生成代码 二、获取uC/OS-III源码 官网下载地址&#xff1a;Micrium Software and Documentation - Silicon Labs 网盘下载&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;lzjl 三、复…

深入解析Java HashMap的putVal方法

Java中的HashMap是我们在开发中经常使用的集合之一&#xff0c;它提供了基于哈希表的数据存储方式&#xff0c;使得对数据的插入、删除和查找操作都具有较高的效率。在本文中&#xff0c;我们将深入解析HashMap中的putVal方法&#xff0c;揭示其内部工作原理。通过对代码的逐行…

【QT5】<应用> 小游戏:贪吃蛇

文章目录 一、项目要求 二、需求分析 三、实现效果 四、代码 一、项目要求 【1】主要实现&#xff1a;游戏界面存在一条蛇&#x1f40d;&#xff0c;使用键盘wsad或者↑↓←→键盘可以控制蛇的行走方向。同时界面中会随机出现食物&#xff0c;蛇可以吃食物&#xff0c;然后…

前端面试题日常练-day59 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末 1. 在PHP中&#xff0c;以下哪个符号用于比较两个值的相等性&#xff1f; a) b) c) d) ! 2. PHP中的预定义变量$_POST用于获取什么类型的数据&#xff1f; a) 用户的输入数据 b) 浏览器发送的请…

近期面试HW中级蓝问题(非常详细)零基础入门到精通,收藏这一篇就够了

01 — HW问题 1.sqlmap拿shell的原理&#xff0c;需要什么条件&#xff0c;–os-shell的原理 2.冰蝎的流量特征 3.哥斯拉的流量特征 4.如果判断一个web是s2写的 5.fastjson了解嘛&#xff1f;Log4j了解嘛&#xff1f;如何在流量中发现Log4j的攻击特征 6.HW前的准备工作…

正则表达式的详解带你认识正则表达式的意义

前言 ​ 我们都知道协议通常通过添加固定的字符、报头、特定的数字等来定义数据的结构和格式。将正确的信息提取出来是十分重要的&#xff0c;而正则表达式可以用来描述和匹配这些固定的结构&#xff0c;从而提取出所需的信息。并且正则表达式还可以处理大量复杂的字符串。这篇…

微信小程序基础工作模板

1.轮播图 点击跳转官方文档 简单例子 <!-- 顶部轮播图 --> <swiper indicator-dots"true" class"banner" autoplay"true" interval"2000"><swiper-item><image src"../../images/轮播图1.jpg" >…

LeetCode 239.滑动窗口最大值【困难】

思路 构建一个单调递增的队列类型&#xff0c;pop和push操作在队列内部进行特殊定义&#xff08;队头存储当前滑动窗口的最大值&#xff1b;队列中比插入元素小的队尾元素均要移除&#xff1b;比队尾元素小的元素直接插入队列&#xff1b;当滑动窗口移除的元素和队头元素相等时…

解决:git SSL certificate problem: unable to get local issuer certificate

解决&#xff1a;git SSL certificate problem: unable to get local issuer certificate 错误&#xff1a; git SSL certificate problem: unable to get local issuer certificate 这个问题是由于没有配置信任的服务器HTTPS验证。默认&#xff0c;cURL被设为不信任任何CAs&a…

【JMeter接口测试工具】第二节.JMeter基本功能介绍(下)【入门篇】

文章目录 前言八、Jmeter常用逻辑控制器 8.1 如果&#xff08;if&#xff09;控制器 8.2 循环控制器 8.3 ForEach控制器九、Jmeter关联 9.1 正则表达式提取器 9.2 xpath提取器 9.3 JSON提取器十、跨越线程组传值 10.1 高并发 10.2 高频…

vue3第三十七节(自定义插件之自定义指令)防重指令

引言&#xff1a;自定义指令&#xff0c;我们可以通过插件的形式进行全局注册&#xff1a; 例如&#xff1a;在提交按钮请求接口时候&#xff0c;为了防止重复提交&#xff0c;而导致的请求资源浪费&#xff0c;或者是新增提交时候&#xff0c;防止新增相同的数据。 我们的全局…

力扣930.和相同的二元子数组

力扣930.和相同的二元子数组 哈希表法 最终[l,r]区间和为goal sum为记录的非递减前缀和 sum[r] - sum[l] goal因此遍历右端点时 找到左端点为sum[l]的出现次数即可 class Solution {public:int numSubarraysWithSum(vector<int>& nums, int goal) {int n nums…

关于修改Python中pip默认安装路径的终极方法

别想了&#xff0c;终极方法就是手动复制&#xff0c;不过我可以给你参考一下手动复制的方法 关于手动移动pip安装包的方法 别想了&#xff0c;终极方法就是手动复制&#xff0c;不过我可以给你参考一下手动复制的方法一、首先确认一下pip默认安装路径二、再确认一下需要移动到…

Python中包(package)与模块(module)的概念 以及 import 问题

目录 Python中 包(package) 与 模块(module) 的概念一. Python中, 包 (package) 与 模块 (module) 的概念1. 一个有 __init__.py 文件 的目录, 被视为一个 Python 的 包 (package)2. 一个Python源文件 , 被视为一个模块 (module) 二. 不同包之间 以及 同一个包的不同模块之间的…

信号:干扰类别及特征提取(二)

目录 第二部分&#xff1a;特征提取 一&#xff1a;瞬时特征参数 1.零中心归一化瞬时幅度之谱密度的最大值 2.非弱信号段零中心归一化瞬时幅度的标准偏差 3.零中心归一化瞬时幅度绝对值的标准偏差 4.零中心归一化非弱信号段瞬时频率的标准偏差 5.零中心归一化非弱信号段…

Codeforces Round 951 (Div. 2)

A - Guess the Maximum 直接暴力枚举 a i , a i 1 a_i,a_{i1} ai​,ai1​找最小的最大值 答案即为最小的最大值-1 code: #include<bits/stdc.h> #define endl \n #define fast() ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr) #define F first #…