数组和特殊矩阵的压缩存储

news2024/12/27 17:08:37

文章目录

  • 一维数组
  • 二维数组
  • 特殊矩阵
    • 对称矩阵
    • 三角矩阵
    • 三对角矩阵
    • 稀疏矩阵
      • 三元组法
      • 十字链表法

一维数组

以一维数组A[0...n-1]为例,其存储结构关系式为

LOC ⁡ ( a i ) = LOC ⁡ ( a 0 ) + i × L ( 0 ⩽ i < n ) \operatorname{LOC}\left(a_i\right)=\operatorname{LOC}\left(a_0\right)+i \times L \quad(0 \leqslant i<n) LOC(ai)=LOC(a0)+i×L(0i<n)

其中 L L L是每个数组元素所占的存储单元。

若以一维数组A[1...n]为例,其存储结构关系式为

LOC ⁡ ( a i ) = LOC ⁡ ( a 0 ) + ( i − 1 ) × L ( 1 ⩽ i ⩽ n ) \operatorname{LOC}\left(a_i\right)=\operatorname{LOC}\left(a_0\right)+(i-1) \times L \quad(1 \leqslant i\leqslant n) LOC(ai)=LOC(a0)+(i1)×L(1in)

其中 L L L是每个数组元素所占的存储单元。

二维数组

对于多维数组,有两种映射方法:按行优先按列优先。以二维数组为例,设二维数组的行下标与列下标的范围分别为 [ 0 , h 1 ] [0,h_1] [0,h1] [ 0 , h 2 ] [0,h_2] [0,h2]

  • 按行优先的存储结构式为: LOC ⁡ ( a i , j ) = LOC ⁡ ( a 0 , 0 ) + [ i × ( h 2 + 1 ) + j ] × L \operatorname{LOC}\left(a_{i, j}\right)=\operatorname{LOC}\left(a_{0,0}\right)+\left[i \times\left(h_2+1\right)+j\right] \times L LOC(ai,j)=LOC(a0,0)+[i×(h2+1)+j]×L
    在这里插入图片描述
  • 按列优先的存储结构式为: LOC ⁡ ( a i , j ) = LOC ⁡ ( a 0 , 0 ) + [ j × ( h 1 + 1 ) + i ] × L \operatorname{LOC}\left(a_{i, j}\right)=\operatorname{LOC}\left(a_{0,0}\right)+\left[j \times\left(h_1+1\right)+i\right] \times L LOC(ai,j)=LOC(a0,0)+[j×(h1+1)+i]×L

在这里插入图片描述

特殊矩阵

对称矩阵

对一个 n n n阶矩阵 A A A中的任意一个元素 a i , j a_{i,j} ai,j都有 a i , j = a j , i ( 1 ≤ i , j ≤ n ) a_{i,j}=a_{j,i}(1\leq i,j \leq n) ai,j=aj,i(1i,jn),则称为对称矩阵。若仍采用二维数组存放,则会浪费几乎一半的空间,为此将 n n n阶对称矩阵 A A A存放在一维数组 B [ n ( n + 1 ) / 2 ] B[n(n+1)/2] B[n(n+1)/2]中。
在这里插入图片描述

三角矩阵

下三角矩阵中,上三角区的所有元素均为同一常量。其存储思想与对称矩阵类似,不同之处在于存储完下三角区和主对角线上的元素之后,紧接着存储对角线上方的常量一次,所以可以将 n n n阶下三角矩阵 A A A压缩存储在 B [ n ( n + 1 ) / 2 + 1 ] B[n(n+1)/2+1] B[n(n+1)/2+1]中。

在这里插入图片描述
在数组 B B B中,位于元素 a i , j ( i ≥ j ) a_{i,j}(i\geq j) ai,j(ij)前面的元素个数为

第1行:1个元素
第2行:2个元素
……
i − 1 i-1 i1行: i − 1 i-1 i1个元素
i i i行: j j j个元素

故元素 a i , j a_{i,j} ai,j在数组 B B B中的下标(-1的目的是下标从0开始)
k = 1 + 2 + … … ( i − 1 ) + j − 1 = ( 1 + ( i − 1 ) ) ( i − 1 ) 2 + j − 1 = ( i − 1 ) i 2 + j − 1 k=1+2+……(i-1)+j-1=\frac{(1+(i-1))(i-1)}{2}+j-1=\frac{(i-1)i}{2}+j-1 k=1+2+……(i1)+j1=2(1+(i1))(i1)+j1=2(i1)i+j1

元素下标之间的对应关系为

k = { i ( i − 1 ) 2 + j − 1 , i ⩾ j n ( n + 1 ) 2 , i < j k= \begin{cases}\frac{i(i-1)}{2}+j-1, & i \geqslant j \\ \frac{n(n+1)}{2}, & i<j \end{cases} k={2i(i1)+j1,2n(n+1),iji<j

上三角矩阵中,下三角区的所有元素均为同一常量。只需存储主对角线、上三角区上的元素和下三角区的常量一次,可将其压缩存储在 B [ n ( n + 1 ) / 2 + 1 ] B[n(n+1)/2+1] B[n(n+1)/2+1]中。

在这里插入图片描述
在数组 B B B中,位于元素 a i , j ( i ≤ j ) a_{i,j}(i≤j) ai,j(ij)前面的元素个数为

第1行: n n n个元素
第2行: n − 1 n-1 n1个元素
……
i − 1 i-1 i1行: n − i + 2 n-i+2 ni+2个元素
i i i行: j − i + 1 j-i+1 ji+1个元素( a i , i a_{i,i} ai,i开始到第 a i , j a_{i,j} ai,j该行一共有 j − i + 1 j-i+1 ji+1个元素)

故元素 a i , j a_{i,j} ai,j在数组 B B B中的下标(-1的目的是下标从0开始)
k = n + ( n − 1 ) + … … + ( n − i + 2 ) + ( j − i + 1 ) − 1 = ( n + ( n − i + 2 ) ) ( i − 1 ) 2 + j − i = ( 2 n − i + 2 ) ( i − 1 ) 2 + j − i k=n+(n-1)+……+(n-i+2)+(j-i+1)-1=\frac{(n+(n-i+2))(i-1)}{2}+j-i=\frac{(2n-i+2)(i-1)}{2}+j-i k=n+(n1)+……+(ni+2)+(ji+1)1=2(n+(ni+2))(i1)+ji=2(2ni+2)(i1)+ji

元素下标之间的对应关系为

k = { ( 2 n − i + 2 ) ( i − 1 ) 2 + j − i , i ⩽ j n ( n + 1 ) 2 , i > j k= \begin{cases}\frac{(2n-i+2)(i-1)}{2}+j-i, & i \leqslant j \\ \frac{n(n+1)}{2}, & i>j \end{cases} k={2(2ni+2)(i1)+ji,2n(n+1),iji>j

三对角矩阵

对角矩阵也称带状矩阵。对 n n n阶矩阵 A A A中的任意一个元素 a a a,当 ∣ i − j ∣ > 1 |i-j|>1 ij>1时,若有 a i , j = 0 ( 1 ≤ i , j ≤ n ) a_{i,j}=0 (1≤i,j≤n) ai,j=0(1i,jn),则称为三对角矩阵。

三对角矩阵 A A A也可以采用压缩存储,将3条对角线上的元素按行优先方式存放在一维数组 B B B中,且 a 1 , 1 a_{1,1} a1,1存放于 B [ 0 ] B[0] B[0]中,可将其压缩存储在 B [ 3 n − 2 ] B[3n-2] B[3n2]中。
在这里插入图片描述

  • a i , j → B [ k ] a_{i,j} \rightarrow B[k] ai,jB[k]:即矩阵下标转换为压缩数组下标。

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 i i行的第 j − i + 2 j-i+2 ji+2个元素
a i , j a_{i,j} ai,j是第 3 ( i − 1 ) − 1 + ( j − i + 2 ) = 2 i + j − 2 3(i-1)-1+(j-i+2)=2i+j-2 3(i1)1+(ji+2)=2i+j2个元素,所以元素 a i , j ( 1 ≤ i , j ≤ n , ∣ i − j ∣ ≤ 1 ) a_{i,j}(1≤i,j≤n,|i-j|≤1) ai,j(1i,jn,ij1)在一维数组 B B B中存放的下标为 k = 2 i + j − 3 k=2i+j-3 k=2i+j3(下标从0开始,故要-1)。

  • B [ k ] → a i , j B[k]\rightarrow a_{i,j} B[k]ai,j:即压缩数组下标转换为矩阵下标。

根据三对角矩阵的定义: ∣ i − j ∣ ≤ 1 |i-j|\leq 1 ij1,可知 i − 1 ≤ j ≤ i + 1 i-1\leq j \leq i+1 i1ji+1,根据 a i , j → B [ k ] a_{i,j} \rightarrow B[k] ai,jB[k],可知 k = 2 i + j − 3 k=2i+j-3 k=2i+j3,故有 i − 1 ≤ k + 3 − 2 i ≤ i + 1 i-1\leq k+3-2i\leq i+1 i1k+32ii+1,有 3 ( i − 1 ) ≤ k + 1 ≤ 3 i − 1 3(i-1)\leq k+1 \leq 3i-1 3(i1)k+13i1,有 i ≤ k + 1 3 + 1 i\leq\frac{k+1}{3}+1 i3k+1+1 i ≥ k + 2 3 i\geq\frac{k+2}{3} i3k+2,故可以推出 i = ⌊ k + 1 3 + 1 ⌋ i=\lfloor\frac{k+1}{3}+1\rfloor i=3k+1+1 i = ⌈ k + 2 3 ⌉ i=\lceil\frac{k+2}{3}\rceil i=3k+2,最后通过 j = k + 3 − 2 i j=k+3-2i j=k+32i,带入 i i i反算出 j j j来。

稀疏矩阵

矩阵中非零元素的个数 t t t,相对矩阵元素的个数 s s s来说非常少,即 s ≫ t s≫t st的矩阵称为稀疏矩阵(结点数≫边数)。例如,一个矩阵的阶为 100 × 100 100×100 100×100,该矩阵中只有少于 100 100 100个非零元素。

三元组法

将非零元素及其相应的行和列构成一个三元组(行标 i i i,列标 j j j,值 a i , j a_{i,j} ai,j)。然后按照某种规律存储这些三元组线性表。稀疏矩阵压缩存储后便失去了随机存取特性。

在这里插入图片描述
定义三元组结点

typedef struct {
	int data;			// 数据域
	int i, j;			// 行列坐标域
} Node;

定义三元组

typedef struct {
	Node s[Maxsize];		// 三元组数组
	int size;				// 当前三元组元素个数
} Triplet;

十字链表法

为了解决三元组法中,压缩存储失去其随机存取特性,我们采用十字链表法,

十字链表法主要由以下几部分组成:

  1. 矩阵结点(Node): 每个节点包含以下字段:

    • 行索引(rowIndex): 元素所在的行。
    • 列索引(colIndex): 元素所在的列。
    • 值(value): 元素的值。
    • 行链表指针(right): 指向当前元素所在行的下一个非零元素。
    • 列链表指针(down): 指向当前元素所在列的下一个非零元素。
  2. 行头节点(Row Header Nodes): 每一行的头节点,指向该行的第一个非零元素。

  3. 列头节点(Column Header Nodes): 每一列的头节点,指向该列的第一个非零元素。

在这里插入图片描述
矩阵结点结构

typedef struct Node {
    int row, col;
    int value;
    struct Node *right, *down;
} Node;

十字链表结构

typedef struct {
    int rows, cols;			// 行列坐标
    Node **row_heads;		// 行头指针
    Node **col_heads;		// 列头指针
} CrossLinkedList;

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

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

相关文章

AI手语研究数据集;视频转视频翻译和风格化功能如黏土动画;AI检测猫咪行为;开放源码的AI驱动搜索引擎Perplexica

✨ 1: Prompt2Sign 多语言手语数据集&#xff0c;便捷高效用于手语研究。 Prompt2Sign 是一个全面的多语言手语数据集&#xff0c;旨在通过工具自动获取和处理网络上的手语视频。该数据集具有高效、轻量的特点&#xff0c;旨在减少先前手语数据集的不足之处。该数据集目前包含…

基于springboot+vue的公司资产网站(全套)

一、系统架构 前端&#xff1a;vue2 | element-ui 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | node 二、代码及数据库 三、功能介绍 01. 管理后台-登录 02. 管理后台-首页 03. 管理后台-个人中心-修改密码 04. 管理后台-个人…

CentOS7 部署单机版 ElasticSearch + Logstash

一、部署ElasticSearch Elasticsearch部署参考下面文章&#xff1a; CentOS7 部署单机版 elasticsearch-CSDN博客文章浏览阅读285次&#xff0c;点赞6次&#xff0c;收藏3次。ElasticSearch&#xff0c;用于检索、聚合分析和大数据存储https://blog.csdn.net/weixin_44295677…

N1912A P 系列双通道功率计

N1912A 双通道功率计 产品综述 <<<P 系列双通道功率计>>> Keysight N1912A P 系列双通道功率计可以提供峰值功率、峰均比、平均功率、上升时间、下降时间 NS 脉冲宽度测量。 “ 功能特点 30 MHz 视频带宽 能够以高达 100 MSa/s 的采样率执行单次实时捕…

从华为云OBS到AWS云上S3:迁移及相关事项

随着云计算的快速发展&#xff0c;企业越来越倾向于将数据存储和管理移到云端。华为云的对象存储服务&#xff08;OBS&#xff09;和亚马逊云服务&#xff08;AWS&#xff09;上的简单存储服务&#xff08;S3&#xff09;是两个备受欢迎的选择。对于那些考虑从华为云OBS迁移到A…

OrangePi AIpro 变身 Android 打包机

主板基本信息介绍 OrangePi AIpro&#xff0c;是香橙派联合华为精心打造&#xff0c;建设人工智能新生态而设计的一款开发板&#xff0c;这次为大家分享下我上手的这款 OrangePi AIpro 8GB&#xff08;算力达8TOPS&#xff09; 的一些小小的经验。 基本参数如下&#xff1a; …

【亲测有效】发现了适用于Mac用户的ChatGPT客户端登陆方法

项目场景&#xff1a; Mac用户的ChatGPT客户端登陆 问题描述 无法使用 解决方案&#xff1a; 1.下载登陆ChatGPT客户端 https://persistent.oaistatic.com/sidekick/public/C...https://persistent.oaistatic.com/sidekick/public/ChatGPT_Desktop_public_latest.dmg 2.登陆…

设计模式 21 备忘录模式 Memento Pattern

设计模式 21 备忘录模式 Memento Pattern 1.定义 备忘录模式是一种行为型设计模式&#xff0c;它允许你将一个对象的状态保存到一个独立的“备忘录”对象中&#xff0c;并在之后恢复到该状态。 2.内涵 主要用于以下场景&#xff1a; 需要保存对象状态以备恢复&#xff1a; 当…

Kubernetes集群调度

一.List-Watch 1.调度约束 Kubernetes 是通过 List-Watch **** 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 Node 节点上面建立 P…

【OCPP】ocpp1.6协议第3.13章节SmartCharging介绍及翻译

目录 3.13 SmartCharging智能充电-概述 智能充电的目标 关键功能 消息类型 负载管理 动态电量配置 总结 3.13 SmartCharging智能充电-译文 3.13.1 Charging Profile Purpose充电配置的目的 3.13.2 Stacking charging profile堆叠充电配置 3.13.3 Combining charging profile pu…

如何在线转换图片的格式?一键修改图片格式的方法

图片是日常生活和工作中的一种常用的内容展示类型&#xff0c;在使用图片的时候不同用途需要使用的图片格式也是不同的&#xff0c;比如我们手中有一张jpg格式图片&#xff0c;但是平台上传要求格式是png&#xff0c;那么怎样才能将jpg转png格式呢&#xff1f;下面将教大家图片…

前端面试:项目细节重难点问题分享

面试官提问&#xff1a;我现在给你出一个项目实际遇到的问题&#xff1a;由于后端比较忙&#xff0c;所以我们这边的列表数据排序需要前端最近实现&#xff0c;那你会怎么实现排序呢&#xff1f; 答&#xff1a;我的回答&#xff1a;确实&#xff0c;数据都是由后端实现的&…

2024年上半年软件设计师试题及答案(回忆版)--选择题

基础知识选择题 基础知识选择题 1,2,3][4,5,6][1,2,3,4,5,6] &#xff08;总&#xff1a;1分&#xff09; &#xff08;注意&#xff1a;括号内的是截止当前题目总分&#xff09; vlan不能隔绝内外网 &#xff08;2分&#xff09; 链路层使用交换机&#xff0c;…

关于已配好java环境但双击无法打开jar包的解决方案

如果你已经装好了 java 环境直接跳到最后看解决方法即可 先说一下你安装的 java 环境&#xff0c;如果完全是默认选项安装&#xff0c;则会安装 jdk 和 jre&#xff0c;并且在安装 jre 时还需要安装目录下为空&#xff0c;其实 jre 的安装是多余的&#xff0c;因为安装的 jdk 里…

Integer包装类

面试题&#xff1a; 自动装箱:把基本数据类型会自动的变成其对应的包装类 自动拆箱:把包装类自动的变成其对象的基本数据类型 package Integer;public class Demo {public static void main(String[] args) {Integer i 10;String binaryString Integer.toBinaryString(i);Str…

pyqt QLineEdit单行文本框控件

pyqt QLineEdit单行文本框控件 介绍效果代码 介绍 QLineEdit 是 PyQt中的一个控件&#xff0c;用于输入和编辑单行文本。它允许用户输入和编辑一行纯文本&#xff0c;并提供了许多有用的功能&#xff0c;如文本验证、密码输入&#xff08;显示为点或星号&#xff09;、自动完成…

ICode国际青少年编程竞赛- Python-6级训练场-递归入门

ICode国际青少年编程竞赛- Python-6级训练场-递归入门 1、 def recur(n):# 边界条件if n<1:return# 额外动作Dev.step(n)Dev.turnRight()# 递归调用recur(n-1)recur(8)2、 def recur(n):# 边界条件if n<1:return# 额外动作Dev.step(n)Dev.turnLeft()# 递归调用recur(n-1)…

一些Spring的理解

说说你对Spring的理解 首先Spring是一个生态&#xff1a;可以构建企业级应用程序所需的一切基础设施 但是&#xff0c;通常Spring指的就是Spring Framework&#xff0c;它有两大核心&#xff1a; IOC和DI 它的核心就是一个对象管理工厂容器&#xff0c;Spring工厂用于生产Bea…

初识STM32单片机-TIM定时器

初识STM32单片机-TIM定时器 一、定时器概述二、定时器类型2.1 基本定时器(TIM6和TIM7)2.2 通用定时器(TIM2、TIM3、TIM4和TIM5)2.3 高级定时器(TIM1和TIM8) 三、定时中断基本结构和时基单元工作时序3.1 定时器基本结构3.2 预分频器时序3.3 计数器时序3.3.1 计数器有无预装时序(…

七大获取免费https的方式

想要实现https访问最简单有效的的方法就是安装SSL证书。只要证书正常安装上以后&#xff0c;浏览器就不会出现网站不安全提示或者访问被拦截的情况。下面我来教大家怎么去获取免费的SSL证书&#xff0c;又如何安装证书实现https访问。 一、选择免费SSL证书提供商 有多家机构提…