数据结构之数组

一、定义

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

二、内存结构

1.创建数组

        我们创建一个数组 int[] array = {22,33,88,66,55,25} ,在内存结构如下图所示:

首先创建了array数组,会在堆内存开辟一个连续的存储空间,因为我们定义的是int类型,所以是占4个字节。然后会在栈内存定义变量array,变量array会指向数组的首地址,这里指向0x1110。

2.查找数组元素

(1)查找方法

        在java中就是通过下标来获取,比如获取array[1],就是数组的第二个元素。那在内存是怎么找到的呢?

        寻址公式:a[i] = baseAddress + i * dataTypeSize。

        baseAddress: 数组的首地址。

        dataTypeSize:代表数组中元素类型的大小,int型的数据,dataTypeSize=4个字节。

                                   

例如,找88这个元素,a[2]=10+2*4=18,就找到该元素的首地址了。                                       ​​​           ​​​​​​​     

(2)为什么索引从0开始

        如果数组的索引从1开始,寻址公式中,就需要增加一次减法操作,对于CPU来说就多了一次指令,性能不高。

3.总结

        1. 在根据数组索引获取元素的时候,会用索引和寻址公式来计算内存所对应的元素数据,寻址公式是:数组的首地址+索引乘以存储数据的类型大小。

        2. 如果数组的索引从1开始,寻址公式中,就需要增加一次减法操作,对于CPU来说就多了一次指令,性能不高。

三、时间复杂度

1.随机查询(根据索引查询)

        数组元素的访问是通过下标来访问的,计算机通过数组的首地址寻址公式能够很快速的找到想要访问的元素。所以时间复杂度就是O(1)。

public int test01(int[] a,int i){    return a[i];
}

2.未知索引查询

(1)情况一

        我们在查找数组内的元素,查找55号数据时,是直接去循环一个一个找的,没有排序。如果第一次就找到,时间复杂度是O(1),最后才找到的,时间复杂度是O(n),所以平均时间复杂度就是O(n)。时间复杂度的计算可以看我之前的帖子。

(2)情况二

        我们先排序好数组内的元素,再去查找55号数据。我们使用二分查找的方法,第一次找到22,发现比55小,然后只看剩下的,再查找就可以找到55这个元素了,每找一次,可以减少一半的元素,也就是n=2^{i},其中i是执行的次数,所以时间复杂度就是O(\log n)。

3.插入、删除

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

        假设数组的长度为 n,现在如果我们需要将一个数据插入到数组中的第 k 个位置。为了把第 k 个位置腾出来给新来的数据,我们需要将第 k~n 这部分的元素都顺序地往后挪一位。

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

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

四、总结

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

        2. 数组下标为什么从0开始? 寻址公式是:baseAddress+ i * dataTypeSize,计算下标的内存地址效率较高。

        3. 随机(通过下标)查询的时间复杂度是O(1) ,查找元素(未知下标)的时间复杂度是O(n) ,查找元素(未知下标但排序)通过二分查找的时间复杂度是O(logn)。

        4. 插入和删除的时候,为了保证数组的内存连续性,需要挪动数组元素,平均时间复杂度为O(n)。

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

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

相关文章

数据结构与算法:线性数据结构

1. 深入理解数组、链表、栈和队列 在计算机科学和软件工程领域,数据结构是构建算法和解决实际问题的基础。其中,数组、链表、栈和队列是最基本、最常用的数据结构之一。本文将深入探讨这些数据结构的定义、特性以及基本操作,帮助读者更好地理…

AI智能语音机器人开源源码系统二次开发各版本部署

产品性能:现在市场上的电话机器人最核心的功能就除了​‌‌有智能电话机器人话术配置,一键导入数据资料,根据时间设置进行外呼。还可以对筛选出意向客户进行按意向度分类。并进入CRM客户管理系统,这是市场是最常见的也是最基本的电…

Python实现FPGA板卡仿真验证方法

在Python中针对FPGA板卡进行仿真,通常可以使用一些特定的库或工具来实现。以下是一些常用的方法: HDL模拟器:对于FPGA设计,通常使用硬件描述语言(HDL)如Verilog、VHDL来描述电路,然后使用HDL模拟…

Node.js基础---npm与包

包 概念:Node.js 中的第三方模块又叫做包 来源:由第三方个人或团队开发出来的,免费使用,且为开源 为什么需要:Node.js的内置模块只有一些底层API,开发效率低 包是基于内置模块封装出来的,提供更…

python实现跨进程(跨py文件)通信01

前言 项目中总会遇到数据需要跨进程通信的问题,今天就给大家带来一套简单的跨进程通信代码。代码分为服务端与客户端两部分。 一、server端 import multiprocessing import timedef do_socket(conn, addr, ):try:while True:if conn.poll(1) False:time.sleep(0…

ZCANPRO基础操作流程

硬件准备 测试单关节需要准备如下工具: 电源: 推荐使用20-27V直流电源。关节峰值功率为额定功率的三倍。 CAN卡: 推荐使用周立功USB转CANFD卡,我们的单关节测试软件适配了该型号CAN卡驱动。 WHJ系列关节模组 WHJ系列关节模组包含…

2024最新大厂Android面试真题解析,三年老Android经验面经

前言 不知道大家面试的时候,有没有遇到这种情况,面试工资谈的是10K,最后干着40K的活!说着冠冕堂皇,提升大家能力的话,做着死命压榨员工,996成了程序员心里的魔咒! 初级安卓开发工程…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的活体人脸检测系统(Python+PySide6界面+训练代码)

摘要:本篇博客详细讲述了如何利用深度学习构建一个活体人脸检测系统,并且提供了完整的实现代码。该系统基于强大的YOLOv8算法,并进行了与前代算法YOLOv7、YOLOv6、YOLOv5的细致对比,展示了其在图像、视频、实时视频流和批量文件处…

golang学习参考记录

1.ORM结果处理 - GoFrame (ZH)-v1.15 - GoFrame官网 - 类似PHP-Laravel, Java-SpringBoot的Go企业级开发框架 2.mysql操作 GORM连接Mysql数据库 - 梯子教程网

CSS_实现三角形和聊天气泡框

如何用css画出一个三角形 1、第一步 写一个正常的盒子模型&#xff0c;先给个正方形的div&#xff0c;便于观察&#xff0c;给div设置宽高和背景颜色 <body><div class"box"></div> </body> <style>.box {width: 100px;height: 100px…

常用git 打tag命令

1.查看所有tag git tag 2.创建 v5.0.0的tag git tag v5.0.0 git tag &#xff08;创建后查看&#xff09; 3.推送到远程tag git push origin v5.0.0 4.删除远程tag git push origin --delete v5.0.0 5.删除本地tag git tag -d v5.0.0 6.添加带有备注信息的tag git tag v5.…

在Vue开发中v-if指令和v-show指令的使用介绍,v-if和v-for的优先级以及使用注意事项的介绍

文章目录 一、条件渲染1、v-if2、v-else3、v-else-if4、\<template> 上的 v-if5、v-show 二、区别&#xff1a;1、渲染区别2、性能区别&#xff1a; 三、v-if和v-for的优先级四、注意事项 一、条件渲染 1、v-if v-if 指令用于条件性地渲染一块内容。这块内容只会在指令…

Java反射机制底层原理

反射机制 这篇文章我是参考了Java 中的反射机制&#xff08;两万字超全详解&#xff09;_java反射-CSDN博客 然后我在这里做一下总结&#xff0c;因为原文章真的很好&#xff0c;我才疏学浅没什么进行补充&#xff0c;只能做出自己的总结并且写一下自己对这个的理解。 原理&…

配置artifactory的反向代理和域名访问

一、概述 在许多情况下&#xff0c;组织会通过反向代理来提供对 Artifactory 的访问。在某些情况下&#xff0c;例如使用 Artifactory 作为 Docker 注册表&#xff0c;这种设置甚至是强制性的。为了简化反向代理的配置&#xff0c;Artifactory 提供了生成反向代理的功能&#x…

实战LangChain(一):构建您的第一个聊天机器人

实战LangChain(一):构建您的第一个聊天机器人 实战LangChain(一):构建您的第一个聊天机器人 文章目录 实战LangChain(一):构建您的第一个聊天机器人引言开始使用1.安装2.使用 openai 构建聊天机器人3.使用千问或者chatglm构建聊天机器人结论引言 doc 地址 简介 |🦜…

户用光伏储能系统组成结构

随着光伏与储能产业的发展和融合&#xff0c;户用光伏储能系统应运而生&#xff0c;“储能”是指电能存储功能&#xff0c;可以保证电网断电或没电的情况下家庭正常用电&#xff0c;提升用电安全性和稳定性。 1.光伏电池板 是光伏系统的核心部分&#xff0c;利用太阳能产生电…

spring boot学习第十三篇:使用spring security控制权限

该文章同时也讲到了如何使用swagger。 1、pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…

vue - - - - - vue3使用draggable拖拽组件

vue3使用draggable拖拽组件 一、组件安装二、插件使用三、遇到的问题1. missing required prop&#xff1a; “itemKey” 一、组件安装 yarn add vuedraggablenext // or npm i -S vuedraggablenext二、插件使用 <template><draggableitem-key"id"class&q…

吴恩达机器学习笔记十三 多分类问题(multiclass) Softmax 神经网络的softmax输出 softmax改进

多分类问题指可能会有多于两个的输出标签&#xff0c;而不只是0或1的问题。 Softmax算法是逻辑回归的一种推广。 例如 y 有四种可能的取值时&#xff1a; 成本函数 例如有十种类别的输出&#xff0c;此时称这个神经网络有一个softmax输出层或上层是softmax层 softmax layer有…

前端 JS 经典:typeof 和 instanceof 区别

1. typeof typeof 用于判断一个变量的数据类型&#xff0c;返回一个表示数据类型的字符串。可以对如下类型进行判断&#xff1a;undefined、boolean、number、string、bigint、symbol、function 和 object。对 null 的判断是object&#xff0c;这是个历史遗留问题。 typeof n…