1.让数组动起来

概述

对数组进行分析,目标如下

  • 线性表的概念
  • 数组的存储结构
  • 数组查询,插入,删除操作的特点及对应的时间复杂度
  • 刷题(盛最多水的容器)

线性表

在数据结构中,数据的逻辑结构分为线性结构非线性结构
线性结构: n个数据元素有序集合,特征如下:

  1. 集合中必存在唯一的一个第一个元素
  2. 集合中必存在唯一的一个最后的元素
  3. 除最后元素之外,其它数据元素均有唯一的 后继
  4. 除第一元素之外,其它数据元素均有唯一的前驱

数据结构中线性结构指的是数据元素之间存在着一对一的线性关系的数据结构,这个线性并不是说一定是直线,常见的线性数据结构有:数组(一维),链表队列;表现形式如下:
在这里插入图片描述
相对应于线性结构,非线性结构的逻辑特征是一个结点元素可能对应多个直接前驱和多个后驱,比如: 等,如下图
在这里插入图片描述

数组基础

概念和结构

数组(Array)是一种用连续的内存空间存储相同数据类型数据的线性数据结构

int[] array = new int[]{10,20,30}

内存结构中如下图
在这里插入图片描述
数组的表示方式:使用下标来获取数组元素数据
在这里插入图片描述
操作平台是如何根据下标来找到对应元素的内存地址?

拿一个长度为10的数组来举例 ,int[] a = new int[10],在下面图中,计算机给数组分配了一块连续的空间,100-139,其中内存的起始地址为 baseAddress=100

在这里插入图片描述
计算机给每个内存单元都分配了一个地址,通过地址来访问其数据,因此访问数组中某个元素时,首先要经过一个寻址公式计算要访问的元素,在内存中的地址:

a[i] = baseAddress + i * dataTypeSize

其中dataTypeSize代表数组中元素类型的大小,在这个例子中,存储的是int型的数据,因此dataTypeSize=4 个字节

下标为什么从0开始而不是1呢?

个人想来,从数组存储的内存模型上来看,下标最确切的定义应是偏移(offset),如果用array来表示数组的首地址,array[0]就是偏移为0的位置,也就是首地址,array[k] 就表示偏移ktypeSize 的位置,所以计算array[k]的内存地址用这个公式

array[k]_address = baseAddress + k * typeSize

如果下标从1开始,那么计算array[k]的内存地址会变成

array[k]_adress = baseAddress + (k-1) * typeSize

对比两个公式,不难发现从数组下标1开始去访问数组元素,对于 cpu 来说,多了一次减法指令

另一个原因,c语言设计者使用0开始作为数组的下标,后来的高级语言沿用了这一设计(也有从1开始的)

数组的特点

查询O(1)

数组元素的访问是通过下标来访问的(不是遍历),计算机通过数组的首地址和寻址公式能够很快速的找到想要访问的元素

public class Demo {public static void main(String[] args) {int[] array = new int[]{10, 20, 30};System.out.println("打印:" + test(array, 1));}public static int test(int[] a, int i) {return a[i];}
}

代码的执行次数并不会随着数组的数据规模大小变化而变化,是常数级的,所以查询单个数据操作的时间复杂度为O(1)

插入删除O(n)

数组是一段连续的内存空间,因此为了保证数组的连续性会使用数组的插入和删除的效率变的很低

数据插入

假设数组的长度为n,现在需要将一个数据插入到数组中第k个位置,为了将第k个位置腾出来给新的数据,需要将第k~n这部分的元素都顺序的往后挪一位,如下图所示:
在这里插入图片描述
插入操作对应的时间复杂度是多少呢?

最好的情况下是O(1),最坏的情况下是O(n),平均情况下的时间复杂度是O(n)

数据删除

同数据插入可得:如果要删除第k个位置的数据,为了内存的连续性,也需要搬移数据,不然中间就会出现空洞,内存就不连续了,时间复杂度仍然为O(n)

如果要提高数据删除的效率呢?

在某些特殊场景下,并不一定非得追求数组中数据的连续性;如果将多次删除操作集中在一起执行,删除的效率是不是会提高很多
example:数组a[6]中存了6个元素:a1,a2,a3,a4,a5,a6,现在要依次删除a1,a2这两个元素
在这里插入图片描述
为了避免a3,a4,a5,a6这几个数据被搬移两次,可以先记录下已经删除的数据,每次的删除操作并不是真正的移数据,只是记录数据 已经被删除,当数组没有更多的空间存储时,再触发执行一次真正的删除操作,这样就大大减少了删除操作导致的数据搬移
这种思想,就是jvm标记清除垃圾回收算法的核心思想

刷题

盛最多水的容器

盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。

i 条线的两个端点是 (i, 0)(i, height[i]) 两个端点的距离(高度)即数组下标i的值
在这里插入图片描述

暴力美学,朴素解法

public class Demo {public static void main(String[] args) {System.out.println(maxArea(new int[]{1, 8, 6, 2, 5, 4, 8, 3, 7}));}public static int maxArea(int[] height) {int max = 0;for (int i = 0; i < height.length; i++) {for (int j = i + 1; j < height.length; j++) {// 比较两条线,哪个低(得出宽高算面积)int lineHeight = Math.min(height[i], height[j]);int width = j - i;max = Math.max(max, width * lineHeight);}}return max;}
}

双指针,速度快

示例1图中所示,要面积最大,要么x轴要宽,要么 y 轴要高,所以,开始x轴最大,算面积,后面比较两上y 轴,y轴相对较小的继续向前或向后移动,这就是双指针

public class Demo {public static void main(String[] args) {System.out.println(maxArea2(new int[]{1, 8, 6, 2, 5, 4, 8, 3, 7}));}public static int maxArea2(int[] height) {int max = 0;// 第一步 , x轴距离最大,算其面积int i = 0;int j = height.length - 1;while (i != j) {// i = j 已无计算的必要int area = Math.min(height[i], height[j]) * (j - i);if (height[i] < height[j]) {// 如果前指针小于后面的指针,即 height[i] 的值小于 height[j] ,则移动 i ,寻找更大的 y 轴i++;} else {// 反过来一样j--;}max = Math.max(area, max);}return max;}
}

结束

数组至此就结事了,如有问题欢迎评论!

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

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

相关文章

基于深度学习的单图像人群计数研究:网络设计、损失函数和监控信号

摘要 https://arxiv.org/pdf/2012.15685v2.pdf 单图像人群计数是一个具有挑战性的计算机视觉问题,在公共安全、城市规划、交通管理等领域有着广泛的应用。近年来,随着深度学习技术的发展,人群计数引起了广泛的关注并取得了巨大的成功。通过系统地回顾和总结2015年以来基于深…

Kafka - 消息队列的两种模式

文章目录 消息队列的两种模式点对点模式&#xff08;Point-to-Point&#xff0c;P2P&#xff09;发布/订阅模式&#xff08;Publish/Subscribe&#xff0c;Pub/Sub&#xff09; 小结 消息队列的两种模式 消息队列确实可以根据消息传递的模式分为 点对点模式发布/订阅模式 这两…

数字孪生协同仿真:复杂电机篇

​01.简介 电机仿真是现代机电工程研究领域中的重要环节&#xff0c;始于20世纪后半叶&#xff0c;为工程师提供了一种研究、设计和优化各种电机系统的新方式。时至今日&#xff0c;从传统的电动机到现代的电动汽车动力系统&#xff0c;电机仿真技术在电机设计、性能分析和控制…

微信小程序项目案例之导游证考试刷题小程序

前言 很多计算机专业的同学在做毕设选题时不知道该如何选题&#xff0c;有的同学是已经选择了要开发一款小程序&#xff0c;但是又不知道开发哪类小程序。本篇将为大家介绍一个小程序的开发方向&#xff0c;考试刷题类小程序是目前比较火的小程序项目之一&#xff0c;在小程序…

深入解析 Spring Framework 中 @Autowired 注解的实现原理

摘要 关于Autowired注解的作用 Autowired 注解在Spring中的作用是实现依赖注入&#xff08;Dependency Injection&#xff09;&#xff0c;它用于自动装配&#xff08;autowiring&#xff09;Spring Bean 的依赖关系。具体来说&#xff0c; Autowired 注解有以下作用&#xf…

【rust/esp32】wsl2开发环境搭建与测试

文章目录 说在前面流程可能的问题wsl2相关rust相关vscode相关build相关 测试吐槽参考 说在前面 esp型号&#xff1a;esp32s3开发环境&#xff1a;wsl2rustc版本&#xff1a;rustc 1.73.0-nightlyesp idf版本&#xff1a;v5.1.1 流程 目前是按照这个demo的流程可以跑通修改demo…

win10 javaweb 项目8080端口被占用

文章目录 前言出现场景&#xff1a;解决思路&#xff1a; 前言 提示&#xff1a;生活该走向何处&#xff1f;也许你还不知道答案&#xff0c;但是你一定是答案的一部分。 出现场景&#xff1a; 解决思路&#xff1a; 找到运行的进程直接干掉 打开命令窗口&#xff08;win r…

手机平板摄像头如何给电脑用来开视频会议

环境&#xff1a; Iriun Webcam EV虚拟摄像头 钉钉会议 问题描述&#xff1a; 手机平板摄像头如何给电脑用来开视频会议 解决方案&#xff1a; 1.下载软件 手机端和电脑端都下载这个软件&#xff0c;连接同一局域网打开软件连接好 另外一款软件Iriun 也是一样操作 2.打…

【Linux】NTP服务器配置、时间修改

查看当前系统时间date修改当前系统时间date -s "2018-2-22 19:10:30"查看硬件时间hwclock --show修改硬件时间hwclock --set --date "2018-2-22 19:10:30"同步系统时间和硬件时间hwclock --hctosys保存时钟clock –w1.设置NTP Server服务检查系统是否安装n…

SpringBoot中CommandLineRunner详解(含源码)

文章目录 前言实例导入库application.yamlRunnerSpringBootCommandLineRunnerApplication执行结果 先后顺序示例OrderRunner1OrderRunner2执行结果 通常用法加载初始化数据示例 启动后打印应用信息示例 启动异步任务示例 接口健康检查示例 外部服务调用示例 参数校验示例 动态设…

Apache Doris (四十八): Doris表结构变更-替换表

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

力扣第968题 监控二叉树 c++ hard题 二叉树的后序遍历 + 模拟 + 贪心

题目 968. 监控二叉树 困难 相关标签 树 深度优先搜索 动态规划 二叉树 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 示例 1&#xff1a; …

在CentOS上用yum方式安装MySQL8真实全过程记录(顺利版本)

此文参考我前面的文章《在CentOS上用yum方式安装MySQL8过程记录》&#xff0c;之前比较曲折&#xff0c;现在再安装一台mysql。 因为之前很多坑已经走过&#xff0c;加上这台Linux之前没安装过MYSQL&#xff0c;所以整个过程算是非常顺利。 安装环境&#xff1a;centos7 mysql…

如何实现可靠的数据调度同步,数据同步方案看一下!

随着企业规模不断扩大&#xff0c;分支机构越来越多&#xff0c;跨区域跨国的集团越来越多&#xff0c;越来越多的企业要求内部各种业务数据在服务器、数据中心甚至云上&#xff0c;能够进行实时的调度和同步&#xff0c;从而需要部署一套数据同步方案&#xff0c;实现服务器与…

甘特图组件DHTMLX Gantt用例 - 如何自定义任务、月标记和网格新外观

dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 本文将为大家揭示DHTMLX Gantt自定义的典型用例&#xff0c;包括自定义任务、网格的新外观等&#xff0c;来展示其功能的强大性&…

浙江爱知道控股集团,数字化经营的实践者,科技降本增效,助力基业长青

拥抱时代浪潮&#xff0c;加速科技变革。10月27日&#xff0c;浙江爱知道控股集团于西子智慧产业园西子音乐厅举办“AIGC可持续发展峰会”&#xff0c;重点探讨了数字化经营的重要意义。 提高效率和降低成本&#xff1a;数字化经营可以优化和自动化企业的业务流程&#xff0c;提…

软信天成:数据质量管理对企业有什么意义?

在这个信息爆炸的时代&#xff0c;数据已经成为了企业决策的基础&#xff0c;是企业成功的关键要素。然而&#xff0c;如果企业所获取的数据质量不佳&#xff0c;会对企业产生何种影响呢&#xff1f; 事实上&#xff0c;有效而准确的数据可以揭示出潜在的业务机遇&#xff0c;…

接触式静电压测量仪的用途和操作方法

接触式静电压测量仪是一种用于测量静电电荷的仪器&#xff0c;主要用于工业生产和科学研究领域。它可以测量静电电压、静电场强、静电电荷等参数&#xff0c;对于静电控制和环境监测等方面具有重要的作用。 接触式静电压测量仪的操作方法如下&#xff1a; 接通电源&#xff1a;…

什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(1)

先看卷积是啥&#xff0c;url: https://www.bilibili.com/video/BV1JX4y1K7Dr/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 下面这个式子就是卷积 看完了&#xff0c;感觉似懂非懂 下一个参考视频&#xff1a;https://www.y…

【设计模式】第20节:行为型模式之“备忘录模式”

一、简介 备忘录模式也叫快照模式&#xff0c;具体来说&#xff0c;就是在不违背封装原则的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;以便之后恢复对象为先前的状态。这个模式的定义表达了两部分内容&#xff1a;一部分是…