数据结构(其四)--特殊矩阵的存储

news2024/11/24 5:49:33

目录

11.特殊矩阵的压缩存储

(1).一维数组的储存结构

(2).二维数组的存储结构

(3).普通矩阵的存储

(4).特殊矩阵的压缩存储

        i.对称矩阵

        ii.三角矩阵

        iii.三对角矩阵

        iiii.稀疏矩阵


11.特殊矩阵的压缩存储

(1).一维数组的储存结构

        int a[10];

        一维数组的地址是连续的,只要知道了起始地址(LOC,默认是a[0]的地址),就可以知道所有元素的地址。

        

        a[i] 地址的计算 :LOC + i * sizeof(int) .

        注意:有时候给出的LOC可能不是a[0] 的,此时,就要在上式子的i 中减去,如给出的是a[1]的,则计算公式变为 LOC + (i - 1) * sizeof(int).

(2).二维数组的存储结构

        int b[2][4]

        二维数组在内存中有两种存储方法,行优先和列优先。

        当然,从逻辑视角上看,将数据配列成矩阵的样式,更方便进行操作。

        有int b[M][N],b[0][0] 的地址为LOC,则b[i][j]

        行优先:LOC + (i*N + j)*sizeof(int)

        列优先:LOC + (j*M + i)*sizeof(int) 

(3).普通矩阵的存储

        一般是用二维数组

        需要注意的是,矩阵的下标是从(1, 1) 开始的,数组是从(0, 0) 开始的。

(4).特殊矩阵的压缩存储

        i.对称矩阵

        · 是方阵(n阶),

        · 恒有 aij == aji,

        因为对称,所以可以只存储下三角区和对称轴(或上三角区和对称轴)(这样就是所谓的压缩存储)

        

        按行优先将各元素存入一维数组(也可以列优先),

        如此便要思考,

        数组的大小,显然,第一行一个元素,第二行两个元素...第N行N个元素,总数就是n*(n+1)/2.

        数据的调用,因为矩阵的下标与数组的下标规则不同,可以写一个简单的映射函数进行转换

        aij => b[k]

        总结上图,可知

        k = (i+1)*i/2 + j - 1 ,

        即当前元素行数往上为等差数列求和,再加上列数,就是在数组中的第几个元素,再减一,就成了数组下标。(如果,题干给出的数组起始下标为1,k就不需要减去那个1)

        ii.三角矩阵

        

        压缩存储策略:储存aij的三角区,将常数储存在数组最后一位。(以下三角为例)

        数组大小,n*(n+1)/2 + 1.

        aij的ij 与数组下标之间的相互转换与上文相同。

        获取常数项,数组下标就是 n*(n+1)/2。

         值得一提的,在上三角中,求aij是数组中的第几个元素,观察图可知,每行的元素数由N个依次递减。所以,aij 前面有 [n + ... + (n - i + 2)] + (j - i)个元素,中括号里的是此行往上的,那个j-i是当前行内aij 之前的元素。

        iii.三对角矩阵

       以行优先为例,

        数组大小3n - 2

        数组下标(对于aij),前(i - 1)行,有3(i - 1) - 1个元素(每行有三个元素,但第一行只有两个);第i 行中,aij是第j - i + 2个元素,所以aij 就是第2i + j - 2(前后相加)。

        k = 2i + j - 3

        由数组下标逆推矩阵下标ij

        已知b[k]

        是第k + 1个元素,在前i-1行,与前i行之间,3(i - 1) - 1 < k + 1 <= 3i - 1

        i >= (k + 2)/3,左式算出结果后向上取整就是i 值

        (向上取整:如1.2,向上取整就是2,向下就是1) 

        iiii.稀疏矩阵

        压缩策略:

         ① 顺序存储------设置一个类,其中包含三个数组,分别存储i、j、非零数据。

        ② 十字链表法----此为链式存储,

        结点中,包含行、列、值以及两个指针。

        两个指针分别指向同一列的下一个结点和同一行的下一个结点。

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

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

相关文章

上位机 OPC协议、KepServerEX

OPC 全称 OLE For Process Control 》》OPC&#xff08;Open Platform Communications&#xff0c;以前称为 OLE for Process Control&#xff09;是一组软件技术 opc出现之前&#xff0c;软件和硬件是分开的&#xff0c; 如果要与不同的设备通信&#xff0c;需要用各个厂商的…

DepthB2R【附代码】(权限提升)

靶机下载地址&#xff1a; https://www.vulnhub.com/entry/depth-1,213/https://www.vulnhub.com/entry/depth-1,213/ 1. 主机发现端口扫描目录扫描 1.1. 主机发现 nmap -sn 192.168.43.0/24|grep -B 2 08:00:27:08:B4:07 1.2. 端口扫描 nmap -p- 192.168.43.112 1.3. 目录…

NoSQL 数据库之MongoDB

MongoDB 是一个开源的 NoSQL 数据库&#xff0c;由 MongoDB Inc. 研发和维护。它采用文档存储模型&#xff0c;使用 JSON 类似的 BSON&#xff08;二进制 JSON&#xff09;格式来存储数据。MongoDB 具有高性能、易扩展和高可用性等特点&#xff0c;广泛应用于现代 web 应用程序…

Linux学习笔记:iptables命令管理

1、iptables简介 其实iptables只是Linux防火墙的管理工具而已&#xff0c;位于/sbin/iptables。真正实现防火墙功能的是netfilter&#xff0c;它是Linux内核中实现包过滤的内部结构。 语法格式&#xff1a;iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION -t&#…

sqllabs通关

sqllabs5:(报错注入) ?id1 回显You are in........... ?id2-1 回显You are in........... ?id1 回显 1 LIMIT 0,1 判断是字符型&#xff0c;闭合。?id1order by 3-- //页面显示正常我们试了4行得出是报错注入 我们先爆库名 http://127.0.0.1/sqli-labs-master/L…

技术详解:视频美颜SDK与直播美颜插件开发指南

本篇文章&#xff0c;小编将详细探讨如何开发视频美颜SDK以及如何将其集成到直播应用中。 一、视频美颜SDK的基本原理 视频美颜SDK其实现的基本步骤如下&#xff1a; 1.图像采集与预处理&#xff1a;从相机或视频流中获取原始图像帧&#xff0c;进行必要的预处理如色彩空间转…

IoTDB 入门教程 基础篇②——IoTDB 企业版比开源版本值在哪?

文章目录 一、前文二、功能对比三、可视化控制台四、白名单五、审计日志六、数据备份七、机器学习八、总结 一、前文 IoTDB入门教程——导读 二、功能对比 由天谋科技官网得知&#xff0c;IoTDB&#xff08;开源版&#xff09;与TimechoDB&#xff08;企业版&#xff09;的功能…

Android Studio Gradle多渠道打包

原理使用Android Studio打一次渠道包&#xff0c;用反编译工具反编译后&#xff0c;修改渠道信息重新编译 准备文件 分渠道配置文件&#xff1a;channel.txt ↓ # 多渠道配置里“统计平台”、“市场名称”、“渠道编号”分别代表什么意思&#xff1f; # 统计平台&#xff1a;…

Java 后端接收HTML等标签数据,到后端标签丢失

文章目录 前言一、修改Xss配置总结 前言 一开始以为是接收参数出了问题&#xff0c;后面看了RequestBody注解并不会改变参数&#xff0c; 最后发现是xss的配置问题。 一、修改Xss配置 把enabled: true改成false就好了 #xss配置,防止xss攻击 xss:#过滤开关&#xff1a;enable…

简单的docker学习 第10章 docker管理监控平台

第10章 Docker管理监控平台 当 Docker引擎中管理的镜像、容器、网络等对象数量变得越来越多时&#xff0c;通过简单的 docker命令来管理已经显得使人力不从心了。于是就出现了很多的 Docker 可视化管理平台。我们这里对现在较流行的、使用较多的几种平台进行介绍。 10.1 Dock…

【Python】torch.nn模块中函数详解和示例(一)

前言 在深度学习日益成为解决复杂问题重要工具的今天&#xff0c;PyTorch凭借其灵活性和易用性&#xff0c;成为了众多研究者与开发者的首选框架。本系列博客 将对torch中的nn模块中186个函数进行介绍&#xff0c;以函数首字母从a到z的排序开展&#xff0c;包含函数原理、原型…

【css】 CSS3+JS做一个酷炫的仪表进度条3d进度条

创建一个动态进度环组件 在现代网页设计中&#xff0c;进度环是一种常见的视觉元素&#xff0c;用于展示任务的完成度或加载状态。本文将介绍如何使用Vue.js和Less创建一个动态进度环组件&#xff0c;该组件不仅具有美观的视觉效果&#xff0c;还能够根据用户输入动态改变颜色…

「链表」Floyd判环法(弗洛伊德判圈法|龟兔赛跑法)/ LeetCode 141(C++)

给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;…

【C++】C++11的新特性 — function 包装器 , bind包装器

有些人的生活&#xff0c;可以轻轻松松&#xff0c;有些人的生活就是奥运会&#xff0c;生下来就在跑道上&#xff0c;如果不去全力奔跑&#xff0c;注定会被淘汰&#xff0c;更何况&#xff0c;即使努力奔跑&#xff0c;也未必能战胜很多人。 -- 傅首尔 -- C11的新特性 1 fun…

判断字符串是否接近:深入解析及优化【字符串、哈希表、优化过程】

本文将详细解析解决这个问题的思路&#xff0c;并逐步优化实现方案。 问题描述 给定两个字符串 word1 和 word2&#xff0c;如果通过以下操作可以将 word1 转换为 word2&#xff0c;则认为它们是接近的&#xff1a; 交换任意两个现有字符。将一个现有字符的每次出现转换为另…

SQL进阶技巧:多行转列问题中如何保证不同字段内容有序性及一一对应?【collect_list函数有序性保证问题】

目录 0 问题描述【小红书面试题】 1 数据准备 2 问题分析 3 小结 0 问题描述【小红书】 有如下需求,需要将左边的表变换成右边的表,注意字段内容的顺序及对应内容的一致性。 第一个字段为name,第二个字段为subject,第三个字段为score,变换后要求subject按照语文、数学…

android13 禁止某个app接口某个广播 禁止应用接受开机广播 禁止应用接收广播

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.代码更改 4.彩蛋 1.前言 我们在定制系统的过程中,有时候,有些客户的应用的一些表现,并不能满足需求。例如应用接收了开机广播,然后做了一些事情,起调了某些activity。或者接受了某个广播,做了一些操作等…

网络安全第一次作业(ubuntuan安装nginx以及php部署 and sql注入(less01-08)))

ubuntuan安装nginx以及php部署 1.安装依赖包 rootadmin123-virtual-machine:~# apt-get install gcc libpcre3 libpcre3-dev zliblg zliblg-dev openssl libssl-dev2.安装nginx 到https://nginx.org/en/download.html下载nginx 之后将压缩包通过xtfp传输到ubuntu的/usr/loc…

Android:Uniapp平台中接入即构RTC+相芯美颜

0 前言 前阵子使用Uniapp平台开发了一个跨平台app&#xff0c;并且接入了即构RTC后&#xff0c;今天想进一步丰富app的直播功能。之前有相芯美颜的开发经验&#xff0c;打算将相芯美颜接入即构RTC. **在DCloud插件市场找到了在即构RTC接入相芯美颜插件&#xff0c;https://ex…