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

数据结构(ArrayList顺序表)

一、引言

  1. 1.什么是顺序表

    • 定义
      顺序表是一种基于阵列实现的线性表结构,用连续的存储空间保存表中的数据元素,并按顺序排列。

      • 底层依赖阵列,支持随机访问。
      • 元素之间没有额外的连接信息,如指针或链表节点。
      • 通过动态扩容机制克服了静态容量修复的问题。
    • 结构特点

      • 数据存储连续在内存中,索引顺序与逻辑顺序一致。
      • 支持按索引快速访问元素(时间复杂度为O(1)。
      • 对插入、删除操作,移动仓库要素(时间复杂度为)O(n)​​)。

  1. 2.线性表中顺序表与链表的对比

1.线性表介绍:

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结 构,常见的线性表:顺序表、链表、栈、队列...

线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物 理上存储时,通常以数组和链式结构的形式存储。


 

3. 顺序表能干什么?

顺序表可以实现以下功能:

  1. 随机访问

    • 通过索引快速定位和访问任意位置的元素。
    • 例如:list.get(index)在哦(1)欧拉(1)欧( 1 )返回期限指定位置的元素。
  2. 动态扩展

    • 添加新元素时,如果容量不足,顺序表会自动扩容,容纳更多数据。
    • 需要提前知道数据规模,适合处理动态变化的数据。
  3. 创建和删除

    • 支持在任意位置插入或删除元素。
    • 在插入和删除时会移动部分数据,效率比链表低,但在小规模操作时性能仍然较差。
  4. 操作手册

    • 顺序表允许通过循环或迭代器遍历所有元素,适合处理线性数据集合。
  5. 存储社区数据

    • 元素按插入顺序排列,适合存储需要保持顺序的数据。

 

4.为什么要使用顺序表?

优势
  1. 我们随机访问

    • 顺序表的元素存储在连续的内存空间中,支持通过内存下标快速访问,时间复杂度为O(1)。
    • 对比链表,链表的随机访问需要遍历节点,效率为​​。
  2. 动态大小调整

    • 顺序表通过动态扩容机制解决了静态配额容量固定的问题,适合处理数据规模不固定的场景。
    • 例如,用户提交的动态列表、动态扩展的集合等。
  3. 操作简单

    • 顺序表的底层是总线,结构清晰,没有链表复杂的指针操作。
缺点与限制
  • 写作与写作效率低
    • 在非尾部插入或删除元素,需要移动后续数据,时间复杂度为哦(n)在)在)​​。
    • 适合插入和删除少数的场景,不适合间歇更新的场景。
  • 内存连续性要求高
    • 需要在内存中找到足够大的连续存储空间。
    • 如果数据量非常大,内存碎片化可能成为瓶颈。

 

5. 顺序表使用场景

  • 随机访问频繁的场景

    • 如:访问学生的学号列表、查询用户的ID集合等。
    • 顺序表提供哦(1)欧拉(1)欧( 1 )的随机访问性能,比链表更适合此类需求。
  • 数据动态扩展

    • 动态吞吐量是顺序表的一大优势,适合处理需要经常增加数据的场景。
    • 例如:动态收集用户输入、动态创建任务列表。
  • 数据量减少,插入/删除的场景较少

    • 在数据量伸缩且不间歇的场景下,顺序表的插入/删除性能可以接受。
    • 例如:维护一个常见用户名的列表或管理购物车中的商品。
  • 需要顺序存储的场景

    • 数据按照逻辑顺序存储,保持插入顺序。
    • 例如:消息队列、任务列表。
  • 频繁操作的场景

    • 顺序表支持高效的线性遍历,适合批量操作或迭代访问。
    • 例如:统计一组用户的平均年龄。
  • 栈和队列的实现

    • 顺序表可以作为栈和队列的底层实现。
    • 例如:
      • 栈:顺序表尾部的插入和删除非常高效。
      • 队列:通过首尾操作实现队列功能。
  1. 本文目标

    • 学习顺序表的核心原理及功能。
    • 通过 Java 实现理解其底层细节。
    • 对比分析顺序表的性能及其适用场景。

二、顺序表核心功能

以下功能是顺序表的关键操作,每个方法对应不同的算法逻辑:

  1. 初始化

    • 分配存储基础设施,初始化容量,设置当前元素个数为0
    • 提供一个默认初始化容量,也允许用户创建初始容量。
  2. 动态扩张

    • 当元素插入导致容量不足时,自动分配更大的存储空间。
    • 数据迁移到新的存储中,通常扩容为当前容量的两倍。
    • 支持在表尾添加元素(append)。
    • 支持在指定索引插入元素,需要移动部分数据。
    • 从指定索引删除元素,需要将后续元素前移。
    • 设置已删除的存储空间为null,避免内存泄漏。
    • 按索引快速访问元素,复杂度为O(1)。
  3. 清空表

    • 将所有存储位置设置为null,释放占用的内存资源。

三、顺序表基础代码实现

我们通过接口来写顺序表的个个方法:

在我们的实现过程中,我们需要先定义一个数组的内容:

1.新增元素,默认在数组最后新增(add)

在插入数组时,我们需要先考虑,在我们插入这个数据时,数组是否越界,如果不越界我们就正常添加,如果越界了,我们就考虑如何让他不越界(动态扩容):

由此我们新增元素的所有考虑事项就完成了,这个时候我们只需要在数组后面添加元素即可:

2.判断数组是否满了:

如果我们定义的usedSize的值等于数组长度时,此时我们的数组就满了:

不相等就没满:

3.在 pos 位置新增元素

注意事项:1.判断我们的pos位置是否合法;

2.判断我们再添加数据时,数组是否越界;

3.满足上面两条我们就可以直接把数组上pos位置的值添加为我们要的值,

在修改时我们要注意从后遍历,如果从前往后遍历的话,我们表中的数据就会发生覆盖的情况

4.判定是否包含某个元素

我们只需要遍历数组中的之即可:

5.查找某个元素对应的位置

我们只需要遍历数组中的之即可,如果有我们就返回下标值,没有就返回-1:

6.获取 pos 位置的元素

1.检查数组情况,看是否有数据

2.判断我们的pos位置是否合法

3.满足上面两条我们就可以直接返回数组上pos位置的值;

7.给 pos 位置的元素设为 value

1.检查数组情况,看是否有数据

2.判断我们的pos位置是否合法

3.满足上面两条我们就可以直接把数组上pos位置的值改为我们要修改的值

8.删除第一次出现的关键字key

1.检查数组情况,看是否有数据

2.判断我们的pos位置是否合法

3.满足上面两条我们就可以直接把数组上pos位置的值删除我们要的值,

在修改时我们要注意从后遍历,如果从前往后遍历的话,我们表中的数据就会发生覆盖的情况

9.获取顺序表长度

直接返回usedSize的之即可,

10.清除数据

将usedSize的值修改为0,就可清空数组;

11.打印顺序表

,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的

我们只需要遍历数组中的之即可

上述步骤都完成后,我们的顺序表就已经全部写好了,此时我们就可以操作顺序表了

四.总结:

在学习顺序表的过程中,我深刻体会到了数据结构设计的精妙之处。虽然顺序表的概念相对简单,但它却为我们理解更复杂的数据结构奠定了坚实的基础。通过实现顺序表的各种操作,我不仅提高了自己的编程能力,更重要的是培养了逻辑思维和解决问题的能力。在处理插入、删除操作中的边界条件和元素移动问题时,需要仔细思考各种可能的情况,这锻炼了我的严谨性和耐心。

同时,我也认识到在实际应用中选择合适的数据结构是多么关键。不能仅仅因为某个数据结构简单易用就盲目使用,而需要根据具体的需求和场景综合考虑其优缺点,权衡利弊后做出选择。顺序表作为数据结构家族中的一员,虽然有其局限性,但在特定的情况下却能发挥出独特的优势。

总之,顺序表的学习是我数据结构学习道路上的重要一步,我将带着从中学到的知识和经验,继续探索更复杂、更强大的数据结构,为解决更复杂的实际问题积累更多的工具和方法。

相关文章:

数据结构(ArrayList顺序表)

一、引言 1.什么是顺序表 定义: 顺序表是一种基于阵列实现的线性表结构,用连续的存储空间保存表中的数据元素,并按顺序排列。 底层依赖阵列,支持随机访问。元素之间没有额外的连接信息,如指针或链表节点。通过动态扩容…...

直接抄作业!Air780E模组LuatOS开发:位运算(bit)示例

在嵌入式开发中,位运算是一种高效且常用的操作技巧。本文将介绍如何使用Air780E模组和LuatOS进行位运算,并通过示例代码帮助读者快速上手。 一、位运算概述 位运算是一种在计算机系统中对二进制数位进行操作的运算。由于计算机内部数据的存储和处理都是…...

RK3588-LinuxSDK安装

安装依赖软件 执行如下命令,安装 LinuxSDK 开发包依赖软件。 备注:安装过程中,请保证 Ubuntu 可正常访问互联网,若提示"*** is already the newest version ***"表示该软件已安装,请忽略。 Host# sudo apt-get install -y git ssh make gcc libssl-dev \ liblz…...

MATLAB 中有关figure图表绘制函数设计(论文中常用)

在撰写论文时,使用 MATLAB 导出的图像常常因大小和格式不统一,导致投稿时编辑部频繁退稿,要求修改和调整。这不仅浪费时间,也增加了工作量。为了减少这些麻烦,可以在 MATLAB 中导出图像时提前设置好图表的大小、格式和…...

Unity UGUI原理剖析

UI最重要的两部分 UI是如何渲染出来的点击事件如何触发何时发生UI重绘 1:UI如何渲染出来的 UI渲染一定是有顶点的,没有顶点就没法确定贴图的采样,UGUI的顶点在一张Mesh上创建,经过渲染管线UI就渲染到屏幕上了,UI的渲染…...

Spring框架使用xml方式配置ThreadPoolTaskExecutor线程池,并且自定义线程工厂

一、自定义线程工厂 自定义线程工厂需要实现java.util.concurrent.ThreadFactory接口,重写newThread方法。 示例代码: package com.xiaobai.thread;import org.apache.log4j.Logger;import java.util.concurrent.ThreadFactory; import java.util.conc…...

架构-微服务-服务网关

文章目录 前言一、网关介绍1. 什么是API网关2. 核心功能特性3. 解决方案 二、Gateway简介三、Gateway快速入门1. 基础版2. 增强版3. 简写版 四、Gateway核心架构1. 基本概念2. 执行流程 五、Gateway断言1. 内置路由断言工厂2. 自定义路由断言工厂 六、过滤器1. 基本概念2. 局部…...

基于springboot的HttpClient、OKhttp、RestTemplate对比

HttpClient详细 Httpclient基础&#xff01;&#xff01;&#xff01;&#xff01;实战训练&#xff01;&#xff01;&#xff01;&#xff01;-CSDN博客 OKhttp使用 OKhttp导包 <!-- ok的Http连接池 --><dependency><groupId>com.squareup.okhttp3</g…...

(计算机组成原理)期末复习

第一章 计算机的基本组成&#xff1a;硬件软件&#xff08;程序&#xff09;计算机系统 软件有系统软件&#xff08;系统管理工具&#xff09;&#xff0c;应用软件 计算机硬件&#xff1a;包括主机和外设&#xff0c;主机包括CPU和内存&#xff0c;***CPU由运算器和控制器所组…...

从0到1部署Tomcat和添加servlet(IDEA2024最新版详细教程)

本文不仅细化了每一个步骤&#xff0c;实现了从0到1部署Tomcat和添加servlet。还针对IDEA2024版和以前的版本在部署上的区别&#xff0c;做了详细介绍&#xff0c;尤其是add framework support部分。与此同时&#xff0c;针对控制台中文乱码问题&#xff0c;本文也给出了详细解…...

【Java从入门到放弃 之 Java程序基础】

Java程序基础 Java程序基础基本数据类型和变量数据类型变量赋值基本运算算术运算比较运算逻辑运算 Java程序基础 基本数据类型和变量 数据类型 对Java语言而言&#xff0c;有如下基本数据类型。 整数类型&#xff1a;有4种整型byte/short/int/long&#xff0c;它们占用的字…...

2024年11月26日Github流行趋势

项目名称&#xff1a;v2rayN 项目维护者&#xff1a;2dust yfdyh000 CGQAQ ShiinaRinne Lemonawa 项目介绍&#xff1a;一个支持Xray核心及其他功能的Windows和Linux图形用户界面客户端。 项目star数&#xff1a;70,383 项目fork数&#xff1a;11,602 项目名称&#xff1a;fre…...

相亲交友小程序项目介绍

一、项目背景 在当今快节奏的社会生活中&#xff0c;人们忙于工作和事业&#xff0c;社交圈子相对狭窄&#xff0c;寻找合适的恋爱对象变得愈发困难。相亲交友作为一种传统而有效的社交方式&#xff0c;在现代社会依然有着巨大的需求。我们的相亲交友项目旨在为广大单身人士提…...

使用ENSP实现默认路由

一、项目拓扑 二、项目实现 1.路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1关闭信息中心 undo info-center enable 进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为2.2.2.1/24 ip address 2.2.2.1 24进入g0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置为1.…...

CSGO游戏搬砖党如何应对上海Major

大家最近都关注major比赛了吗&#xff1f;目前已经有不少顶尖CSGO战队来到了上海&#xff0c;备战即将到来的2024上海Major赛。本次比赛正赛将于11月30日开打&#xff0c;欧洲、美洲和亚太地区的24支顶尖战队通过两周的角逐&#xff0c;包括揭幕赛、淘汰赛以及决赛三种&#xf…...

【人工智能】AutoML自动化机器学习模型构建与优化:使用Auto-sklearn与TPOT的实战指南

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 机器学习模型的构建和优化是一个复杂且耗时的过程,涉及特征工程、模型选择、超参数调优等多个环节。AutoML(Automated Machine Learning)旨在通过自动化的方式来简化这些流程,提高开发效率并提升模型表现。Au…...

go-zero(八) 中间件的使用

go-zero 中间件 一、中间件介绍 中间件&#xff08;Middleware&#xff09;是一个在请求和响应处理之间插入的程序或者函数&#xff0c;它可以用来处理、修改或者监控 HTTP 请求和响应的各个方面。 1.中间件的核心概念 请求拦截&#xff1a;中间件能够在请求到达目标处理器之…...

vim 如何高亮/取消高亮

高亮 &#xff1a;在ESC模式下使用 shift # 取消高亮&#xff1a;在ESC模式下输入英文输入 :nohl (no highlight)...

蓝桥杯练习题

目录 1.劲舞团 2.数字诗意 3.封闭图形个数 4.回文数组 欢迎 1.劲舞团 0劲舞团 - 蓝桥云课 #include <iostream> using namespace std; int main() {int num1,M0;long long c[1000000];int cnt0;string a,b ;while(cin>>a>>b>>c[cnt])//系统自动输入…...

【设计模式】创建型模式之单例模式(饿汉式 懒汉式 Golang实现)

定义 一个类只允许创建一个对象或实例&#xff0c;而且自行实例化并向整个系统提供该实例&#xff0c;这个类就是一个单例类&#xff0c;它提供全局访问的方法。这种设计模式叫单例设计模式&#xff0c;简称单例模式。 单例模式的要点&#xff1a; 某个类只能有一个实例必须…...

使用 Docker Compose 来编排部署LMTNR项目

使用 Docker Compose 来部署一个包含 Linux、MySQL、Tomcat、Nginx 和 Redis 的完整项目的例子。假设我们要部署一个简单的 Java Web 应用&#xff0c;并且使用 Nginx 作为反向代理服务器。 项目目录结构 首先需要确保 Docker 和docker-compose已经安装并正在运行。docker --v…...

创建HTTPS网站

每天&#xff0c;我们都会听到网络上发生身份盗窃和数据侵权的案例&#xff0c;这导致用户对自己访问的网站更加怀疑。他们开始更加了解自己将个人信息放在哪里以及信任哪些类型的网站。了解如何使网站使用HTTPS变得比以往任何时候都更加重要。 解读缩略词&#xff1a;HTTP与HT…...

以3D数字人AI产品赋能教育培训人才发展,魔珐科技亮相AI+教育创新与人才发展大会

11月20日&#xff0c;北京中关村国际创新中心迎来了“AI教育创新与人才发展大会暨首届北京数字人才发展大会”的盛大启幕。此次大会汇聚了培训、教育、科技、人才领域的专家学者、行业领袖及企业代表&#xff0c;共同探讨人工智能技术在教育培训领域的革新应用与数字人才培养体…...

springboot配置https,并使用wss

学习链接 springboot如何将http转https SpringBoot配置HTTPS及开发调试 Tomcat8.5配置https和SpringBoot配置https 可借鉴的参考&#xff1a; springboot如何配置ssl支持httpsSpringBoot配置HTTPS及开发调试的操作方法springboot实现的https单向认证和双向认证(java生成证…...

Qt SQL模块概述

Qt SQL支持的数据库 要在项目中使用 Qt SQL 模块&#xff0c;需要在项目配置文件中添加下面一条设置语句&#xff1a; Qt sql在头文件或源文件中使用 Qt SQL 模块中的类&#xff0c;可以使用包含语句&#xff1a; #include <QtSql>这样会将某个 Qt SQL 模块中的所有类…...

JavaWeb后端开发知识储备2

目录 1.HttpClient 2.微信小程序开发 3.Spring Cache 4.Spring Task 4.1cron表达式 4.2入门案例 5.WebSocket协议 1.HttpClient 简单来说&#xff0c;HttpClient可以通过编码的方式在Java中发送Http请求 2.微信小程序开发 微信小程序的开发本质上是前端开发&#xff0…...

RabbitMQ原理架构解析:消息传递的核心机制

文章目录 一、RabbitMQ简介1.1、概述1.2、特性 二、RabbitMQ原理架构三、RabbitMQ应用场景3.1、简单模式3.2、工作模式3.3、发布订阅3.4、路由模式3.5 主题订阅模式 四、同类中间件对比五、RabbitMQ部署5.1、单机部署5.2、集群部署&#xff08;镜像模式&#xff09;5.3、K8s部署…...

redmi 12c 刷机

刷机历程 一个多月前网购了redmi 12c这款手机, 价格只有550,用来搞机再适合不过了, 拆快递后就开始倒腾,网上有人说需要等7天才能解锁,我绑定了账号过了几天又忍不住倒腾,最后发现这块手机不用等7天解锁成功了,开始我为了获取root权限, 刷入了很火的magisk,但是某一天仍然发现/…...

四、Python —— 列表

文章目录 一、列表的初始化1.1、直接初始化1.2、通过 append 函数初始化1.3、 通过 for 语句初始化列表长度和每个位置的数值 二、访问列表元素2.1、越界的含义 三、 使用循环语句遍历列表3.1、通过下标遍历3.2、通过 for...in... 直接遍历 四、列表的切片操作五、列表的复制六…...

Paper -- 建筑高度估计 -- 基于街景图像和深度学习的城区建筑高度计算

基本信息 论文题目: Building height calculation for an urban area based on street view images and deep learning 中文题目: 基于街景图像和深度学习的城区建筑高度计算 作者及单位: – Zhen Xu Furong Zhang Yingying Wu Yajun Yang Yuan Wu – 北京科技大学城市与安全研…...

怎样看是静态网站还是动态网站 怎么操作/新闻最新头条10条

环景&#xff1a; 电脑&#xff1a;联想天逸510pro-181kl 台式电脑 操作系统&#xff1a;Windows 10 专业版 64位 问题描述&#xff1a; 电脑正常关机然后就开不了机&#xff0c; 拔电源线插上开机才行 解决方案&#xff1a; 1.临时办法 拆掉硬盘直接安装在备用主机上面 …...

网站做下CDN防护/培训学校招生方案范文

裤子 36 2迟8 鞋子 42/43稍微有点大 上衣 XXXL(XXL略微有点小) 内裤 XXL就可以要不然腰太细转载于:https://www.cnblogs.com/zhangzs000/p/11007380.html...

wordpress批量导入/营销咨询公司排名前十

前言&#xff1a;从上个月底因为新项目统一平台需要用Qt开发&#xff0c;就开始研究Qt&#xff0c;但是一直感觉没有入门&#xff0c;不知道为什么&#xff0c;很多功能实现了&#xff0c;但是知其然不知其所以然&#xff0c;就像现在设计的项目 使用插件进行开发&#xff0c;做…...

wordpress自适应模板/整合营销活动策划方案

参考参考 参考参考 jshu[]jshu.append({"id":0}) jshu.append({"id":9}) jshu.append({text: “c”, nickname: “cc”})输出[{‘id’: 0}, {‘id’: 9},{‘text’:‘c’,‘nickname’:‘cc’}]...

动态网站建设教程/广州seo关键词优化外包

SET GLOBAL max_allowed_packet10000000000; SET GLOBAL net_buffer_length1000000;...

建立网站的价格/百度网盘搜索引擎官方入口

关系型数据库(SQL)数据库就是用来储存数据的仓库&#xff0c;分为关系型数据库和非关系型数据库&#xff0c;通过关系模型存储数据&#xff0c;称之为“关系型数据库”&#xff0c;简言之就是存储数据的多张表之间存在关联关系。关系型数据库关系型数据库(SQL)特点&#xff1a;…...