数据结构(其二)--线性表(其三)

news2024/9/29 7:19:48

目录

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/1980466.html

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

相关文章

社科经管类:7本期刊被标记为“On Hold”状态!

本周投稿推荐 SCI&EI • 4区“水刊”&#xff0c;纯正刊&#xff08;来稿即录&#xff09; • CCF-B类&#xff0c;IEEE一区-Top&#xff08;3天初审&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; 知网&#xff08;CNKI&#xff09;、谷歌学术 …

Github 2024-08-05 开源项目周报 Top15

根据Github Trendings的统计,本周(2024-08-05统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目4JavaScript项目3Python项目3Java项目2TypeScript项目2C项目1Shell项目1Dockerfile项目1非开发语言项目1免费编程学习平台:freeCodeCamp…

2.2 (2) 调度算法

文章目录 调度算法的评价指标CPU利用率系统吞吐量周转时间等待时间响应时间总结 典型的调度算法先来先服务&#xff08;FCFS&#xff09;短作业优先&#xff08;SJF&#xff09;高响应比优先&#xff08;HRRN&#xff09;时间片轮转调度算法优先级调度算法多级反馈列队调度算法…

动态规划:打家劫舍系列

目录 1. 打家劫舍1(线性数组)(LeetCode198) 解法1&#xff1a;动态规划&#xff08;二维dp数组&#xff09; 解法2&#xff1a;动态规划&#xff08;一维dp数组&#xff09; 解法3&#xff1a;动态规划&#xff08;一维dp数组优化&#xff09; 2. 打家劫舍2(环形数组)…

信号处理——自相关和互相关分析

1.概括 在信号处理中&#xff0c;自相关和互相关是相关分析非常重要的概念&#xff0c;它们能分析一个信号或两个信号在时间维度的相似性&#xff0c;在振动测试分析、雷达测距和声发射探伤得到了广泛的应用。自相关分析的研究对象为一个信号&#xff0c;互相关分析的研究对象…

spring原理(第八天)

aop的实现原理 AOP 底层实现方式之一是代理&#xff0c;由代理结合通知和目标&#xff0c;提供增强功能 除此以外&#xff0c;aspectj 提供了两种另外的 AOP 底层实现&#xff1a; 第一种是通过 ajc 编译器在编译 class 类文件时&#xff0c;就把通知的增强功能&#xff0c;织…

Linux之文件系统

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 C进阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.磁盘 二.对磁盘进行管理 三.通过inode找到文件…

Netty的几种IO模式的实现与切换

写在文章开头 今天我们就基于Netty来简单聊聊开发中几种常见的IO模式以及Netty对于这几种IO模式的实现&#xff0c;希望对你有帮助。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的 java coder &#xff0c;是 CSDN的博客专家 &#xff0c;也是开源项…

如何在RabbitMQ中防止消息丢失

如何在RabbitMQ中防止消息丢失 在分布式系统中&#xff0c;消息的可靠传递是至关重要的。RabbitMQ作为一个强大的消息队列系统&#xff0c;提供了多种机制来确保消息不会丢失。本文将介绍在RabbitMQ中防止消息丢失的几种方法。 消息确认机制 消息发布确认 在RabbitMQ中&…

pdf转换器哪个好?不要错过这4款转换工具

pdf转换器哪个好&#xff1f;选择一款高效的PDF转换器&#xff0c;无疑能极大地便利我们的日常工作与学习。它不仅能够轻松实现PDF文件与Word、Excel、图片等多种格式之间的互转&#xff0c;还支持批量处理&#xff0c;显著提高工作效率。无论是编辑修改、格式调整还是分享传阅…

深入浅出消息队列----【RocketMQ 和 Kafka 消息存储差异对比】

深入浅出消息队列----【RocketMQ 和 Kafka 消息存储差异对比】 RocketMQ 的消息存储Kafka 的消息存储对比 RocketMQ 与 Kafka 本文仅是文章笔记&#xff0c;整理了原文章中重要的知识点、记录了个人的看法 文章来源&#xff1a;编程导航-鱼皮【yes哥深入浅出消息队列专栏】 Roc…

指南!网上卖药品需要什么资质?

随着互联网技术的飞速发展&#xff0c;医药电商已经成为药品和医疗器械销售的重要渠道。处方药的网络销售政策逐步放宽&#xff0c;医药电商行业迎来了快速发展的春天。在这一领域&#xff0c;主要的参与者包括药品销售公司和电商平台。 为了吸引流量和满足处方药审方的需求&a…

第18课 Scratch入门篇:时钟-当前时间

时钟 故事背景&#xff1a; 在一个遥远的科技星球上&#xff0c;时间对于居民们来说无比珍贵。这个星球上的居民们都是技术高手&#xff0c;他们使用先进的编程技术来管理自己的生活。然而&#xff0c;星球上的时间系统最近出现了故障&#xff0c;导致时间的流逝变得不稳定。为…

【终极指南】大模型二次开发:从零基础到高手之路

随着人工智能技术的发展&#xff0c;预训练的大模型&#xff08;例如GPT系列、BERT等&#xff09;已成为自然语言处理领域的关键技术之一。对于开发者来说&#xff0c;掌握如何基于这些大模型进行二次开发&#xff0c;不仅可以提升自身的技术实力&#xff0c;还能为企业带来更多…

Flink 如何处理背压

文章目录 目录 前言 一、什么是背压&#xff1f; 二、处理背压的步骤 1.模拟背压机制 2.为什么要关心背压问题&#xff1f; 总结 前言 初次接触Flink的同学会对背压有很多的疑问。本文就是我学习的一些心得和体会&#xff0c;以及借鉴一些文章的感想。 Flink 如何处理背压效应…

使用snap的安装docker配置阿里云镜像加速

使用snap安装docker非常的简单&#xff0c;一条命令即可 snap install docker 但是通过这个命令安装的docker, 配置阿里云镜像跟常规安装的配置起来不太一样, 下面讲一下配置流程 修改docker配置文件/var/snap/docker/current/config/daemon.json 这个文件应该是已经创建好…

重磅!LangChain 官方发布 Agent IDE!!

1 LangChain 开发现状 LangChain 从应用开发框架出发&#xff0c;提供了一套代码级工具集&#xff0c;旨在降低 LLM 的开发难度&#xff0c;在过去一年中吸引了众多开发者&#xff0c;助力他们迅速打造 AI 大模型应用。然而&#xff0c;还有一群用户&#xff0c;他们希望门槛…

NC 最长无重复子数组

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给定一个长度…

idea连接oracle

配置 注意&#xff1a; SID指的是实例名称

C语言宠物系统3

在前面的基础上&#xff0c;加上了修改功能和排序功能&#xff0c;可以选择姓名排序&#xff0c;年龄排序&#xff0c;价格排序。 test.c源文件 #include "Pet.h"void menu() {printf("------------------------\n");printf("- 欢迎来到宠物商店 …