数组(数据结构)

优质博文:IT-BLOG-CN

一、简介

数组Array是一种线性表数据结构,它用一组连续的内存空间,存储一组具有相同类型的数据

数组因具有连续的内存空间的特点,数据拥有非常高效率的“随机访问”,时间复杂度为O(1)。但因要保持这个连续的内存空间,导致数组在删除或插入操作的时非常低效。因为数组为了保持连续性,必然会涉及大量数据的迁移,这个是非常消耗时间的,平均时间复杂度为O(N)

二、数组的随机访问

数组的随机访问是有个寻址公式的,上问中我们提到过数组是用一组连续的内存空间存储数据元素的,然而每个内存单元都有自己的地址(在计算机里面就是通过这个地址访问数据的),又加上每个内存单元的大小都是一样的,这样就很容易得到一个公式了,如下所示:

a[i]_address = base_address + i * data_type_size

我们来简单解释一下上述公式,其中data_type_size表示数组中每个元素的大小,base_address表示内存块的首地址,i表示数组下标。

三、数组的基本操作

【1】创建数组

public class MyArray {      private int[] array;     // 数组大小     private int size;           public MyArray(int capacity) {         this.size = 0;         this.array = new int[capacity];     }      
}

【2】读取元素: 我们知道数组在内存中是连续存储的,所以根据上文的寻址公式可以知道,我们可以根据数组下标i快速定位到对应的元素。

int[] array={1,2,3,4,5,6}; 
System.out.println(array[1]);  // 输出的是2  因为数组的下标是从0开始的。

【3】更新元素: 我们可以根据数组下标快速查找到对应元素。那么同样道理,我们可以根据数组下标i快速更新元素,这中间涉及两个过程,首先就是找到数组下标i对应的数据元素A,然后将新的数据元素B赋值给A即完成更新。

int[] array={1,2,3,4,5,6}; 
System.out.println(array[1]);  // 输出的是2  
//更新数组下标为 1 的数组元素 
array[1]=7; 
System.out.println(array[1]); // 输出的是7

【3】插入元素:相比读取、更新操作,插入元素稍微复杂一些,分为以下两种情况:

尾部插入: 首先,我们看看尾部插入,这种情况很简单,在数组的最后新增一个新的元素,此时对于原数组来说没有任何影响,时间复杂度为0(1)。如下图所示:

中间插入: 如果在数组的中间位置插入元素的话,此时会对插入元素位置之后的元素产生影响,也就是这些数据需要向后依次挪动一个位置。如下图所示:

/**  * 插入元素* @param index  待插入的位置  * @param element 待插入的元素 */ 
public void insert(int index, int element){     if(index < 0 || index > size) {        throw new IndexOutOfBoundsException("超过数组容量 ! 插入失败!");      }     // 从左到右,将元素向右移动一位     for (int i = size-1; i > index; i--) {array[i+1] = array[i];}     // 此时index这个位置已经腾空了,可以放进入element     array[index]=element;     //数组中元素个数+1     size++; 
}

【4】删除元素: 删除元素和插入元素类似,如果我们删除第k个位置的数据,为了内存的连续性,同样会涉及数据的挪动。如下图所示:

数组
/**  * 根据数组下标删除元素* @param index 数组下标 * @return  */ 
public int delete(int index) {     if (index < 0 || index > size) {         throw new IndexOutOfBoundsException("已经超过数组容量 ! 插入失败!");     }     int deleteElement = array[index];     // 从左到右,将元素向左移动一位     for (int i = index; i < size - 1; i++) {         array[i] = array[i + 1];     }     size--;     return deleteElement; 
}

四、数组扩容

因为数组的长度在创建的时候已经确定了,当插入元素的时候如果数组已经满了,是没办法插入成功的。这个时候就要考虑数组扩容的问题了,那么该如何实现扩容呢?

其实我们可以这样,比如此时的数组是A, A已经满了,我们再创建一个数组B且数组长度是A的2倍,然后我们将数组A的元素全部放到数组B中,这样就完成了数组扩容了。

/** 数组扩容为原数组的二倍 **/ 
public void resize(){  int[] newArray = new int[array.length * 2];  System.arraycopy(array, 0, newArray, 0, array.length);  // 把从索引0(第一个0)开始的array.length个数字复制到索引为0(第二个0)的位置上  array = newArray;
}

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

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

相关文章

#力扣:9. 回文数@FDDLC

9. 回文数 - 力扣&#xff08;LeetCode&#xff09; 一、Java class Solution {public boolean isPalindrome(int x) {String s Integer.toString(x); // 转换成字符串return new StringBuilder(s).reverse().toString().equals(s);} } 二、C #include <string> #i…

ubuntu使用whisper和funASR-语者分离-二值化

文章目录 一、选择系统1.1 更新环境 二、安装使用whisper2.1 创建环境2.1 安装2.1.1安装基础包2.1.2安装依赖 3测试13测试2 语着分离创建代码报错ModuleNotFoundError: No module named pyannote报错No module named pyannote_whisper 三、安装使用funASR1 安装1.1 安装 Conda&…

黑豹程序员-架构师学习路线图-百科:Database数据库

文章目录 1、什么是Database2、发展历史3、数据库排行网4、总结 1、什么是Database 当今世界是一个充满着数据的互联网世界&#xff0c;各处都充斥着大量的数据。即这个互联网世界就是数据世界。 支撑这个数据世界的基石就是数据库&#xff0c;数据库也可以称为数据的仓库。 …

typescript开发环境搭建

typescript是基于javascript的强类型标记性语言&#xff0c;使用typescript语言可开发出不同规模的、易于扩展的web前端页面应用&#xff0c;本文主要描述typescript的开发环境搭建。 npm install -g typescript 如上所示&#xff0c;在本地开发环境中&#xff0c;使用nodejs…

基于Redis实现消息队列的实践

为什么要基于Redis实现消费队列&#xff1f; 消息队列是一种典型的发布/订阅模式&#xff0c;是专门为异步化应用和分布式系统设计的&#xff0c;具有高性能、稳定性及可伸缩性的特点&#xff0c;是开发分布式系统和应用系统必备的技术之一。目前&#xff0c;针对不同的业务场…

群狼调研(长沙物业第三方评优)开展房地产市场调查内容设计

湖南房地产市场近年来表现出多元化的发展趋势。为了在竞争激烈的市场中获得更好的发展&#xff0c;房地产企业需要密切关注市场变化&#xff0c;合理规划开发项目&#xff0c;同时提高产品质量和服务水平&#xff0c;以满足消费者的需求和期望。群狼调研(长沙神秘顾客调查)在房…

localhost和127.0.0.1都可以访问项目,但是本地的外网IP不能访问

使用localhost和127.0.0.1都可以访问接口&#xff0c;比如&#xff1a; http://localhost:8080/zhgl/login/login-fy-list或者 http://127.0.0.1:8080/zhgl/login/login-fy-list返回json {"_code":10000,"_msg":"Success","_data":…

数组在TypeScript中是如何工作的

在 TypeScript 中&#xff0c;数组是一种特殊的数据类型&#xff0c;用于存储多个相同类型的值。它提供了一种有效的方式来组织和访问多个数据。 数组声明和初始化&#xff1a;可以使用以下方式声明和初始化数组。 // 声明并初始化一个字符串数组 let fruits: string[] [&quo…

Element Plus组件库中的input组件如何点击查看按钮时不可编辑,点击编辑时可编辑使用setup

如果你正在使用 Vue 3 和 Composition API&#xff0c;你可以使用 setup 函数来实现 Element Plus 的 Input 组件在点击查看按钮时不可编辑&#xff0c;点击编辑按钮时可编辑的功能。 以下是一个使用 setup 的示例代码&#xff1a; <template><div><el-input …

Pytorch目标分类深度学习自定义数据集训练

目录 一&#xff0c;Pytorch简介&#xff1b; 二&#xff0c;环境配置&#xff1b; 三&#xff0c;自定义数据集&#xff1b; 四&#xff0c;模型训练&#xff1b; 五&#xff0c;模型验证&#xff1b; 一&#xff0c;Pytorch简介&#xff1b; PyTorch是一个开源的Python机…

淘宝商品数据分析接口,淘宝商品详情数据接口

淘宝商品数据分析接口可以通过淘宝API进行获取。 淘宝API是一种程序接口&#xff0c;通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问淘宝平台的数据&#xff0c;包括商品信息、店铺信息、物流信息等&#xff0c;从而实现淘宝平台的数据开放。 通过淘宝API提供的…

外卖小程序源码的安全性和隐私考虑

外卖小程序源码的使用正在成为数字餐饮业的主流选择之一。然而&#xff0c;随着外卖业务的增长&#xff0c;安全性和隐私保护变得至关重要。在本文中&#xff0c;我们将探讨外卖小程序源码的安全性和隐私问题&#xff0c;并提供一些代码示例&#xff0c;以帮助开发者确保其应用…

【改造先序遍历】222. 完全二叉树的节点个数

222. 完全二叉树的节点个数 解题思路-先序 直接改造先序遍历算法针对一个节点 如果节点为空 那么直接返回0其余交给递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* …

回顾C++

大一的时候学过C&#xff0c;当时学得也不深&#xff0c;考试也是糊弄过去的&#xff0c;最近刷力扣的时候&#xff0c;决定一边刷题&#xff0c;一边复习和学习C&#xff0c;在此记录一些C的知识点。反正遇到一点就记录一点&#xff0c;会一直更新。

c++解压压缩包文件

功能实现需要依赖相关头文件和库文件&#xff0c;我这里的是64位的。需要的可以在这下载&#xff1a;https://download.csdn.net/download/bangtanhui/88403596 参考代码如下&#xff1a; #include <zip.h> #pragma comment(lib,"libzip.lib")//解压压缩包 /…

【C++ techniques】Smart Pointers智能指针

Smart Pointers智能指针 看起来、用起来、感觉起来像内置指针&#xff0c;但提供更多的机能。拥有以下各种指针行为的控制权&#xff1a; 构造和析构&#xff1b;复制和赋值&#xff1b;解引。 Smart Pointers的构造、赋值、析构 C的标准程序库提供的auto_ptr template: au…

BEVFormer代码跑通

1 环境配置 1.1 环境安装 # 1 拉取源码 github加速代理https://ghproxy.com/ git clone https://github.com/fundamentalvision/BEVFormer.git# 2 创建虚拟环境 conda create -n bev python3.8 -y# 3 激活虚拟环境 conda activate bev# 4.1 安装torch,torchvision,torchaud…

性能测试笔记

一、性能测试的概念 性能测试的概念 使用自动化工具&#xff0c;模拟不同的场景&#xff0c;对软件各项性能指标进行测试和评估的过程 性能测试的目的 评估当前系统能力&#xff0c;出现性能bug后&#xff0c;优化性能&#xff1a;预测未来的性能需求是否满足 例如&#xf…

Web:前端常用的几种Http请求GET和POST样例

1、简述 在Web开发过程中&#xff0c;少不了发起Http请求服务端的接口数据&#xff0c;在不同的框架中使用了不同的Http请求方式&#xff0c;常用的请求有fetch、 ajax、 axios、XMLHttpRequest、request&#xff0c;以下样例仅供参考。 2、Fetch Fetch API 是一种 JavaScr…

Vue Router(二)

目录 一、嵌套路由 1、路由定义 2、代码例子 3、重定向 二、懒加载 1、缘由 2、代码例子 三、导航守卫 1、全局前置守卫 2、全局后置守卫 3、meta元信息 四、生命周期 1、解释 2、执行顺序 3、例子 五、keep-alive组件缓存&#xff08;保活&#xff09; 1、介…