当前位置: 首页 > news >正文

数据结构-4.1.特殊矩阵的压缩存储


一.一维数组的存储结构:

1.知道一维数组的起始地址,就可以求出任意下标对应的元素所在的地址;

2.注:如果数组下标从1开始,上述公式的i就要改为i-1;

3.数组里的元素类型相同,因此所占空间也相同。


二.二维数组的存储结构:

1.注:数组的存储是连续(计算机的存储是线性的)的,针对非线性的二维数组,为了将其拉成线性结构,就有了行优先列优先两种存储方式;

2.将非线性的二维数组整成线性的好处就是可以实现随机存取;

3.行优先时计算存储地址:公式中i为行,j为列

4.列优先时计算存储地址:公式中i为行,j为列


三.普通矩阵的存储:


四.对称矩阵(行数=列数且关于主对角线对称)的压缩存储:

由于对称矩阵关于主对角线对称,因此在存储对称矩阵的数据时只需要存储对称的一部分即可。

以只存储主对角线+下三角区域为例:

1.数组大小即数组存储的数据个数;

2.行优先中计算某个元素是第几个元素的公式推导:i为行,j为列,i和j全从1开始(一定要注意下标起始位置)

该元素上方有i-1行,第i行有i个元素(第i-1行有i-1个元素),因此前i-1行共有1+2+...+(i-1)个元素,

该元素所在行从第一个元素到该元素需要j个元素,所以该元素位置公式为[1+2+...+(i-1)]+j

根据对称性,下三角区域的元素将下标的行和列互换位置就可以访问上三角区域的元素:

总结:

要注意出题内容,以进行对应的分析:


五.三角矩阵的压缩存储:

1.下三角矩阵:除了主对角线和下三角区域外,都是常量且值相同;

2.上三角矩阵:除了主对角线和上三角区域外,都是常量且值相同;

3.对于是常量且值相同的那一部分,是无需重复存放那么多数据的,因此只需要处理主对角线和对应的三角区域(不是常量的一部分)即可;

4.将主对角线和对应的三角区域(不是常量的一部分)的数据存入一维数组,需要的内存大小为(1+2+...+n)+1:

公式解读:第n行有n个元素,所以n行需要1+2+...+n,最后还需要一个空间存放常量,因此

总内存大小为(1+2+...+n)+1

注:上三角区域的数据都是值相同的常量,被存放在同一个空间中,在一维数组中下标都一样

同理,对于上三角矩阵,第一行有n个元素,第二行有n-1个元素,由此可得第i行有n-(i-1)个元素

所以第i-1行有n-[(i-1)-1]=n-i+2个元素,前i-1行有1+2+...+(n-i+2)个元素


六.三对角矩阵的压缩存储:

i为行,j为列

1.存储时只需要存储三对角矩阵中的非0元素即可;

2.对于上述图片中三对角矩阵里蓝色框内的部分,第一行和最后一行只有两个元素,其他行都有三个元素,

因此,共有n行,共有2+3(n-2)+2=3n-2个元素,存储三对角矩阵的一维数组的长度为3n-2;

3.求前i-1行有几个元素时,只需要考虑第一行仅两个元素即可,因为重点在前几行,因此

前i-1行有2+3(i-1-1)=3(i-1)-1个元素

4.此时第i行就是当前行,所以小于或者等于;第i-1行就是上面的行,比他们大,不可能取等;

王道书中的k可以理解为要找的元素前总共有k个元素:


七.稀疏矩阵的压缩存储:

1.对于顺序存储稀疏矩阵,可以创建一个结构体,里面创建变量记录行,列,值,也就是该结构体对应一个数据,

再创建一个与该结构体对应的一维数组,就可以顺序的存储稀疏矩阵,

缺点:顺序存储稀疏矩阵访问其中的元素时只能依次遍历,无法随机存取:

2.对于十字链表法,定义如下图的数组,数组里存指针(指针数组),都指向非0元素:


八.总结:


相关文章:

  • C++11 多线程编程-小白零基础到手撕线程池
  • 秋招内推--招联金融2025
  • 论文阅读:多模态医学图像融合方法的研究进展
  • 负载均衡架构解说
  • C++ Linux多进程同步-命名信号量
  • HarmonyOS NEXT:实现电影列表功能展示界面
  • IDEA相关设置总结
  • 03Frenet与Cardesian坐标系(Frenet转Cardesian公式推导)
  • Win10 QT 配置Android开发环境-jdk/sdk/gradle
  • 探究Spring的单例设计模式--单例Bean
  • 25中国烟草校园招聘面试问题总结 烟草面试全流程及面试攻略
  • 国外电商系统开发-需求记录
  • 【C++】异常处理
  • Android Stuido中编译信息出现乱码的解决方式
  • ClickHouse | 查询
  • 2017-08-04 前端日报
  • Fundebug计费标准解释:事件数是如何定义的?
  • Javascripit类型转换比较那点事儿,双等号(==)
  • laravel5.5 视图共享数据
  • Magento 1.x 中文订单打印乱码
  • SOFAMosn配置模型
  • SwizzleMethod 黑魔法
  • 不上全站https的网站你们就等着被恶心死吧
  • 订阅Forge Viewer所有的事件
  • 番外篇1:在Windows环境下安装JDK
  • 前端工程化(Gulp、Webpack)-webpack
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 推荐一个React的管理后台框架
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 【干货分享】dos命令大全
  • 数据可视化之下发图实践
  • ​TypeScript都不会用,也敢说会前端?
  • # linux 中使用 visudo 命令,怎么保存退出?
  • #window11设置系统变量#
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • ()、[]、{}、(())、[[]]命令替换
  • (C++17) optional的使用
  • (SERIES10)DM逻辑备份还原
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (区间dp) (经典例题) 石子合并
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET Core 发展历程和版本迭代
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .Net Remoting(分离服务程序实现) - Part.3
  • .net和jar包windows服务部署
  • .NET命令行(CLI)常用命令
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • ?.的用法
  • ??Nginx实现会话保持_Nginx会话保持与Redis的结合_Nginx实现四层负载均衡