数据结构(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.打印顺序表

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

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

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

四.总结:

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

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

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

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

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

相关文章

HTTPS的单向认证和双向认证是什么?有什么区别?

目录标题 单向认证流程双向认证流程区别 单向认证流程 HTTPS单向认证‌是指只有服务器向客户端证明其身份。在这种认证方式中,服务器会向客户端发送一个由可信证书颁发机构(CA)签发的SSL证书,客户端会验证这个证书以确保服务器的…

Python语法基础(一)

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 关键字参数和不定长参数 关键字参数主要体现在函数的调用上 使用关键字参数的好处是,可以不按照形参的参数传参 比如说,我们定义一个函数 def c1(nam…

音视频技术扫盲之预测编码的基本原理探究

预测编码是一种数据压缩技术,广泛应用于图像、视频和音频编码等领域。其基本原理是利用数据的相关性,通过对当前数据的预测和实际值与预测值之间的差值进行编码,从而实现数据压缩的目的。 一、预测编码的基本概念 预测编码主要包括预测器和…

Android BottomNavigationView 底部导航栏使用详解

一、BottomNavigationView简介 BottomNavigationView是官方提供可以实现底部导航的组件,最多支持5个item,主要用于功能模块间的切换,默认会包含动画效果。 官方介绍地址:BottomNavigationView 二、使用BottomNavigationView a…

【大数据学习 | Spark-Core】Spark提交及运行流程

spark的集群运行结构 我们要选择第一种使用方式 命令组成结构 spark-submit [选项] jar包 参数 standalone集群能够使用的选项。 --master MASTER_URL #集群地址 --class class_name #jar包中的类 --executor-memory MEM #executor的内存 --executor-cores NUM # executor的…

React中事件处理和合成事件:理解与使用

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

[241125] X-CMD 发布 v0.4.14:webtop-Linux 容器桌面;支持 PowerShell 环境;轻松搭建并测试蜜罐环境等

目录 X-CMD 发布 v0.4.14📃Changelog🐧 webtop -- Linux 桌面容器🖥️ pwsh💻 elv|fish|nu|onsh|tcsh🐋 endlessh🐋 cowrie📲 mosh💻 mac -- Mac 实用功能🎆 ascii&#…

Jmeter中的测试片段和非测试原件

1)测试片段 1--测试片段 功能特点 重用性:将常用的测试元素组合成一个测试片段,便于在多个线程组中重用。模块化:提高测试计划的模块化程度,使测试计划更易于管理和维护。灵活性:可以通过模块控制器灵活地…

linux实时操作系统xenomai看门狗(watchdog)机制及作用介绍

版权声明:本文为本文为博主原创文章,转载请注明出处 https://www.cnblogs.com/wsg1100。如有错误,欢迎指正。 文章目录 一、前言PREEMPT-RT(RT Throttling) 一、xenomai watchdog介绍二、xenomai watchdog工作原理三、…

【C语言】字符串左旋的三种解题方法详细分析

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 💯前言💯题目描述💯方法一:逐字符移动法💯方法二:使用辅助空间法💯方法三:三次反转法💯方法对…

【大模型】LLaMA-Factory的环境配置、微调模型与测试

前言 【一些闲扯】 时常和朋友闲聊,时代发展这么快,在时代的洪流下,我们个人能抓住些什么呢。我问了大模型,文心一言是这样回答的: 在快速发展的时代背景下,个人确实面临着诸多挑战,但同时也充满…

Web 表单开发全解析:从基础到高级掌握 HTML 表单设计

文章目录 前言一、什么是 Web 表单?二、表单元素详解总结前言 在现代 Web 开发中,表单 是用户与后端服务交互的重要桥梁。无论是用户登录、注册、搜索,还是提交反馈,表单都无处不在。在本文中,我们将从基础入手,全面解析表单的核心知识点,并通过示例带你轻松掌握表单开…

nodepad配置c/c++ cmd快速打开创建项目文件

前提:下载MinGw,并且配置环境变量 点击阅读次篇文章配置MinGw 无论是哪个编译器,执行c文件都是经历以下步骤: 编译文件生成exe文件执行该exe文件 我们先手动完成这两部 手动编译文件使用指令 gcc {你的c文件} -o {生成文件名}生成exe文件 第二步运行exe直接点击该文…

打造优秀技术文档的三大方向

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

Xcode15(iOS17.4)打包的项目在 iOS12 系统上启动崩溃

0x00 启动崩溃 崩溃日志,只有 2 行,看不出啥来。 0x01 默认配置 由于我开发时,使用的 Xcode 14.1,打包在另外一台电脑 Xcode 15.3 Xcode 14.1 Build Settings -> Asset Catalog Compliter - Options Xcode 15.3 Build S…

如何使用GCC手动编译stm32程序

如何不使用任何IDE(集成开发环境)编译stm32程序? 集成开发环境将编辑器、编译器、链接器、调试器等开发工具集成在一个统一的软件中,使得开发人员可以更加简单、高效地完成软件开发过程。如果我们不使用KEIL,IAR等集成开发环境,…

QUICK 调试camera-xml解析

本文主要介绍如何在QUICK QCS6490使能相机模组。QCS6490的相机基于CameraX的框架,只需通过配置XML文件,设置相机模组的相关参数,就可以点亮相机。本文主要介绍Camera Sensor Module XML和Camera Sensor XML配置的解析,这中间需要c…

数据结构 (11)串的基本概念

一、串的定义 1.串是由一个或者多个字符组成的有限序列,一般记为:sa1a2…an(n≥0)。其中,s是串的名称,用单括号括起来的字符序列是串的值;ai(1≤i≤n)可以是字母、数字或…

汽车渲染领域:Blender 和 UE5 哪款更适用?两者区别?

在汽车渲染领域,选择合适的工具对于实现高质量的视觉效果至关重要。Blender和UE5(Unreal Engine 5)作为两大主流3D软件,各自在渲染动画方面有着显著的差异。本文将从核心定位与用途、工作流程、渲染技术和灵活性、后期处理与合成四…

开源加密库mbedtls及其Windows编译库

目录 1 项目简介 2 功能特性 3 性能优势 4 平台兼容性 5 应用场景 6 特点 7 Windows编译 8 编译静态库及其测试示例下载 1 项目简介 Mbed TLS是一个由ARM Maintained的开源项目,它提供了一个轻量级的加密库,适用于嵌入式系统和物联网设备。这个项…