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

文章目录

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

一维数组

以一维数组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.mzph.cn/news/844114.shtml

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

相关文章

自动化使用 ChatGPT 生成 PPT 大纲 - 基于 Python 和 PyAutoGUI

这篇文章将指导您利用 Python 的 pyautogui 库创建一个自动化的脚本&#xff0c;帮助您使用 ChatGPT 生成公司智能管理平台的 PPT 大纲。该脚本将打开 Chrome 浏览器&#xff0c;访问 ChatGPT 并输入相应的提示词&#xff0c;让 ChatGPT 为您创建 PPT 大纲。 C:\pythoncode\ne…

QGis3.34.5工具软件保存样式,软件无反应问题

在使用QGis软件保存SLD样式的时候&#xff0c;每次保存样式&#xff0c;软件都进入无反应状态&#xff0c;导致无法生成样式文件 百度中多次查询问题点&#xff0c;终未能在在3.34.5这个版本上解决问题。 考虑到可能是软件本身问题&#xff0c;于是删除了3.34.5这个版本&#x…

SAP ABAP MD04屏幕增加:增加列

需求:增加显示销售订单送达方 主要使用二代增强出口:M61X0002 事务码T-code:CMOD 填写描述,保存到对应的包下 分配增强到项目下 激活组件,激活后效果如下 编写ZXM61U04 SAP留出的按钮,填写描述 button1_ez = 送达方. 编写ZXM61U03 *&-------------------------…

Java版招投标管理系统源码:优化流程,提升效率,实现全方位项目管理

在现今日益竞争激烈的招标市场中&#xff0c;企业需要一款强大而灵活的招投标管理系统来优化流程、提升效率。我们的招投标管理系统正是为此而生&#xff0c;它集门户管理、立项管理、采购项目管理、公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理等多…

解决git status提示error bad signature 0x00000000

问题描述&#xff1a; 操作git的时候电脑卡了&#xff0c;重启电脑后git status就提示bad signature 0x00000000&#xff0c;index file corrupt错误&#xff0c;如下&#xff1a; 解决办法&#xff1a; rm -f .git/index git reset

【赠书第25期】C#项目开发实战(微视频版)

文章目录 前言 1 项目构思与需求分析 1.1 项目构思 1.2 需求分析 2 系统设计 2.1 系统架构设计 2.2 数据库设计 2.3 接口设计 3 编码实现 3.1 环境搭建 3.2 编码规范 3.3 编码实现 4 测试与部署 4.1 单元测试 4.2 系统测试 4.3 部署与上线 5 总结与展望 6 推…

代码随想录算法训练营第五十四天||392.判断子序列、115.不同的子序列

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、392.判断子序列 思路 二、115.不同的子序列 思路 一、392.判断子序列 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是…

力扣算法之1070. 产品销售分析 III

力扣传送门 题解 选出每个售出过的产品 第一年 销售的 产品 id、年份、数量 和 价格&#xff0c;很明显就是个排序问题 我的解 SELECT product_id,year as first_year,quantity,price FROM ( SELECT sale_id,RANK() OVER(PARTITION BY product_id ORDER BY [year] asc ) A…

TinyChat: Visual Language Models Edge AI 2.0

TinyChat: Visual Language Models & Edge AI 2.0 要点 了解TinyChat和AWQ最新的技术发展。在边缘部署语言理解模型(LSTM)后&#xff0c;借助于视觉语言模型(VLM)&#xff0c;可以为LLM提供更好地处理图像输入的能力&#xff0c;从而极大方便了文字对话问答、图片标题生成…

C#中结构struct能否继承于一个类class,类class能否继承于一个struct

C#中结构struct能否继承于一个类class&#xff0c;类class能否继承于一个struct 答案是&#xff1a;都不能。 第一种情行&#xff0c;尝试结构继承类 报错&#xff1a;接口列表中的类型"XX"不是接口interface。 一般来说&#xff0c;都是结构只能实现接口&#x…

【第四节】C++的派生与继承

目录 一、继承特性 二、派生类的定义格式 三、派生类的继承方式 3.1 三种继承方式概述 3.2 接口继承和实现继承 四、派生类的构造和析构函数 五、类的成员重定义 六、多重继承 6.1 多继承 6.2 多继承中的二义性问题 七、虚基类 八、总结 一、继承特性 在生物学中&a…

vue学习汇总

目录 一、vue基本语法 1.插值表达式 {{}} 2.显示数据(v-text)和(v-html) 3.事件处理(v-on) 4.循环遍历(v-for) 5.判断语法(v-if) 6.元素显示与隐藏(v-show) 7.动态设置属性(v-bind) 8.数据双向绑定(v-model) 9.计算属性 二、vue组件 1.使用组件的三个步骤 2.注册组…

有趣的css - 列表块加载动效

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是用 css 打造一个极简的列表块加载动效。 最新文章通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页面渲染效果 整…

使用Ollama和Open WebUI管理本地开源大模型的完整指南

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;AI大模型部署与应用专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年5月27日12点20分 &#x1f004;️文章质量&#xff1a;96分 目录 ✨️Open-WebUI介绍 优点 &#x1f4a5;部署教程…

Linux命令 jps(Java Process Status)解释

文章目录 1、第一种解释2、第二种解释3、第三种解释 1、第一种解释 jps 命令本身并不是一个标准的 Unix/Linux 命令&#xff0c;但您可能是想提到 jps 的一个变种或误写了 jps 为 jps&#xff0c;而实际上可能是想提及 jps&#xff08;Java Virtual Machine Process Status To…

Power Bi 自定义进度条,圆角框,矩阵图标的实现

最近项目在做Power BI&#xff0c;我总结了几个常用的自定义样式&#xff0c;分享一下做法。 比如我们要实现如图这样的一个样式&#xff1a; 这包含了一个带文字的自定义进度条&#xff0c;矩阵有树型展开以及图标显示&#xff0c;最外面有圆角框包围。我觉得这几个样式出现…

海云安两大金融案例入编行业典范,七大安全领域实力登榜《2024中国金融网络安全全景图》

近日&#xff0c;数说安全与《中国信息安全》杂志联合编写并发布了《2024年中国金融行业网络安全研究报告》&#xff08;以下简称报告&#xff09;、《2024年中国金融行业网络安全案例集》&#xff08;以下简称案例集&#xff09;、《2024年中国金融行业网络安全市场全景图》&a…

VSCode 报错 之 运行 js 文件报错 ReferenceError: document is not defined

1. 背景 持续学习ing 2. 遇到的问题 在VSCode 右键 code runner js 文件报错 ReferenceError: document is not defined eg&#xff1a; // 为每个按钮添加点击事件监听器 document.querySelectorAll(button).forEach(function (button) {button.addEventListener(click, f…

kafka-守护启动

文章目录 1、kafka守护启动1.1、先启动zookeeper1.1.1、查看 zookeeper-server-start.sh 的地址1.1.2、查看 zookeeper.properties 的地址 1.2、查看 jps -l1.3、再启动kafka1.3.1、查看 kafka-server-start.sh 地址1.3.2、查看 server.properties 地址 1.4、再次查看 jps -l 1…

深入探索C++继承机制:从概念到实践的全面指南

目录 继承的概念及定义 继承的概念 继承的定义 定义格式 继承方式和访问限定符 继承基类成员访问方式的变化 默认继承方式 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 继承与友元 继承与静态成员 继承的方式 菱形虚拟继承 菱形虚拟继承原理 继承…