数据结构与算法--顺序表(Java)

📝个人主页🌹:誓则盟约
⏩收录专栏⏪:Java SE
🤡往期回顾🤡:Java SE--基本数据类型(详细讲解)
🌹🌹期待您的关注 🌹🌹

什么是顺序表?

  • 顺序表是一种线性表的数据结构。
  • 顺序表是用一组地址连续的存储单元依次存储线性表中的数据元素。

顺序表的主要特点:

  1. 逻辑上相邻的元素在物理位置上也相邻。
  2. 可以随机访问表中的任意元素,通过元素的位置序号可以在 O(1) 的时间复杂度内直接获取对应元素。
  3. 插入和删除操作的效率相对较低。例如,在顺序表的中间位置插入一个元素,需要移动大量后续元素,时间复杂度为 O(n) ;删除操作同理。

顺序表的优点:

  1. 随机访问速度快,能够快速获取指定位置的元素。
  2. 存储密度高,不需要额外的指针来链接元素。

顺序表的缺点:

  1. 长度固定,不易扩展。
  2. 插入和删除操作可能涉及大量元素的移动,效率较低。

        举个例子,如果有一个顺序表存储了学生的成绩 [85, 90, 78, 95, 88] ,如果要获取第三个学生的成绩,直接通过索引 2 就能快速得到 78 。但如果要在第二个位置插入一个新成绩 80 ,就需要将后面的元素 90, 78, 95, 88 依次向后移动一位,然后再插入 80 。

        顺序表在很多程序设计中都有应用,比如简单的数组实现、一些对随机访问要求较高而插入删除操作较少的场景等,今天我们用java来简单实现一下顺序表。


构造方法:    

    首先,构造一个顺序表,需要int capacity 表示顺序表的内存大小(这里先传入一个值作为参数,后面内存不够用我们会有专门申请内存的方法)、int size表示表里面元素的个数、Object [] array 来命名这个顺序表,这时候一个最基本的顺序表就被构造出来了,以下是代码实现:

public class Linear_List<E> {private  int capacity = 10;private int size=0;private Object [] array = new Object [capacity];

添加方法:

        要对顺序表array进行添加操作,需要传入两个参数 泛型 element 以及 int index,代表在index下标插入 泛型 element。

        注意:这里需要判断 index 和 size 的大小,如果index<0 || index>size,则理应抛出错误。

        在index位置插入元素,只需要将原来index以及index后面的元素往后移一位,空出来的位置给element即可。下面是添加方法的代码实现:

public void add(E element , int index) {if (index<0 || index>size)throw new IndexOutOfBoundsException("Index out of bounds");for (int i = size; i >index; i--) {array[i] = array[i-1];}array[index] = element;size++;}

        但是当顺序表中存储的元素数量达到当前分配的存储空间上限时,就需要进行扩容。具体来说,常见的情况有:

  • 持续向顺序表中添加元素,导致已分配的存储空间被填满。

        例如,最初分配的顺序表空间能存储 10 个整数,当已经存储了 10 个整数后,如果还需要继续添加新的整数,就需要扩容。

  • 事先无法准确预估元素数量,且实际存储的元素数量超出了初始的预计。

        假设一个用于存储用户订单信息的顺序表,由于促销活动导致订单数量大幅增加,超出了初始分配的空间。

  • 业务需求发生变化,导致需要存储更多的元素。

        比如原本的系统只需要存储一个月内的交易记录,但业务调整后需要存储半年甚至更长时间的交易记录,原有的顺序表空间可能就不够了。

        在进行扩容时,通常会重新分配一块更大的连续存储空间,并将原有的元素复制到新的空间中。扩容的策略可以是按照一定的比例增加空间,例如每次扩容为原来的两倍;也可以是增加固定的大小,如每次增加一定数量的存储单元,原来的那块空间也并不会造成空间浪费,通常会被JVM的垃圾回收机制自动回收。

        通常把扩容操作放在添加方法内部,因为在添加元素时才会有可能需要用到扩容操作,以下是添加了扩容操作的添加方法的代码实现:

public void add(E element, int index) {// 如果索引不在有效范围内,抛出异常if (index < 0 || index > size)throw new IndexOutOfBoundsException("Index out of bounds");// 如果当前元素数量达到容量,进行扩容操作if (size >= capacity) {  int newCapacity = capacity * 2;  // 新容量为原容量的两倍Object[] newArray = new Object[newCapacity];  // 创建新的数组System.arraycopy(array, 0, newArray, 0, size);  // 将原数组内容复制到新数组array = newArray;  // 更新数组引用capacity = newCapacity;  // 更新容量}// 将指定索引及之后的元素向后移动一位for (int i = size; i > index; i--) {array[i] = array[i - 1];}array[index] = element;  // 在指定索引位置插入新元素size++;  // 元素数量加 1
}

删除方法:

        首先,要检查删除操作中指定的索引是否合法。如果索引小于 0 或者大于等于顺序表的当前元素数量,就会抛出一个索引越界的异常,因为这样的索引不存在有效的元素可删除。

        若索引合法,就将指定索引位置之后的元素依次向前移动一位,覆盖要删除的元素位置。然后,把原本顺序表的最后一个位置设置为 null,并将顺序表的元素数量减 1,表示完成了一个元素的删除操作。以下是删除方法的代码实现:

public E remove(int index) {if (index<0 || index>size-1)  throw new IndexOutOfBoundsException("Index out of bounds");E key = (E) array[index];for (int i = index; i <size; i++) {array[i] = array[i+1];}size--;return key;}

判空和get方法:

        判空方法通常用于判断顺序表是否为空。这可以通过检查顺序表中元素的数量来实现。如果元素数量为 0 ,则认为顺序表为空。

        get方法用于获取顺序表中指定索引位置的元素。在实现时,需要先检查索引的合法性,如果索引不合法(小于 0 或大于等于元素数量),则抛出异常。如果索引合法,就返回该索引位置的元素。以下是两种方法的代码实现:

 public boolean is_Empty(){return size==0;}public E get(int index) {if (index<0 || index>size-1)  throw new IndexOutOfBoundsException("Index out of bounds");return (E) array[index];}

转字符串输出(toString)方法:

        toString方法其主要目的是将顺序表的相关信息以字符串的形式进行展示。通常会先获取顺序表中实际存储元素的数组部分,并将其转换为字符串表示。同时,还会获取顺序表中当前元素的数量。

        当调用顺序表对象的 toString 方法时,就能得到一个清晰反映顺序表内部状态的字符串描述,方便进行输出、调试或其他需要以字符串形式获取顺序表信息的操作。以下是toString方法的代码实现:

    public String toString() {StringBuilder builder = new StringBuilder();for (int i = 0; i < size; i++){builder.append(array[i]).append(" "); }return builder.toString();}

完整代码实现:

public class Linear_List<E> {private  int capacity = 10;private int size=0;private Object [] array = new Object [capacity];public void add(E element , int index) {if (index<0 || index>size)throw new IndexOutOfBoundsException("Index out of bounds");if (size>=capacity){  // 扩容int newCapacity = capacity*2;Object[] newArray = new Object[newCapacity];System.arraycopy(array,0,newArray,0,size);array = newArray;capacity = newCapacity;}for (int i = size; i >index; i--) {array[i] = array[i-1];}array[index] = element;size++;}public E remove(int index) {if (index<0 || index>size-1)  throw new IndexOutOfBoundsException("Index out of bounds");E key = (E) array[index];for (int i = index; i <size; i++) {array[i] = array[i+1];}size--;return key;}public boolean is_Empty(){return size==0;}public E get(int index) {if (index<0 || index>size-1)  throw new IndexOutOfBoundsException("Index out of bounds");return (E) array[index];}public String toString() {StringBuilder builder = new StringBuilder();for (int i = 0; i < size; i++) { builder.append(array[i]).append(" "); }return builder.toString();}
}

“静静地目送,享受这一刻,在混乱之中。”——《xingyu_xuan》

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

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

相关文章

【Python面试题收录】Python编程基础练习题②(数据类型+文件操作+时间操作)

本文所有代码打包在Gitee仓库中https://gitee.com/wx114/Python-Interview-Questions 一、数据类型 第一题 编写一个函数&#xff0c;实现&#xff1a;先去除左右空白符&#xff0c;自动检测输入的数据类型&#xff0c;如果是整数就转换成二进制形式并返回出结果&#xff1b…

昇思25天学习打卡营第23天|CV-ResNet50迁移学习

打卡 目录 打卡 迁移学习 实战练习 数据准备 数据处理 数据处理函数 数据处理流程 数据可视化 训练模型 构建Resnet50网络 固定特征进行训练 network 的输出 训练和评估 可视化模型预测 掌握迁移学习的重点在于&#xff0c;了解你的模型结构&#xff0c;通过冻结…

数据库安全审计系统:“可视化、可控化、智能化”护航数据安全

随着政府、企事业单位的业务规模逐步扩大&#xff0c;数据库的数量明显增长&#xff0c;各数据库的访问量激增&#xff0c;数据库安全隐患也日益扩大&#xff0c;主要体现如下&#xff1a; 一是敏感信息被泄露。例如用户姓名、银行账户、联系电话、用户地址等重要信息被泄露。 …

【odoo17 | Owl】前端js钩子调用列表选择视图

概要 在我们选择多对一或者多对多字段的时候&#xff0c;经常看到可以弹出列表弹窗让人一目了然的效果&#xff0c;效果如下&#xff1a; 那么&#xff0c;这种效果是odoo本身封装好的组件&#xff0c;我们在平时的前端界面开发的时候&#xff0c;既不是后端视图的情况下&#…

【YOLOv5/v7改进系列】引入中心化特征金字塔的EVC模块

一、导言 现有的特征金字塔方法过于关注层间特征交互而忽视了层内特征的调控。尽管有些方法尝试通过注意力机制或视觉变换器来学习紧凑的层内特征表示&#xff0c;但这些方法往往忽略了对密集预测任务非常重要的被忽视的角落区域。 为了解决这个问题&#xff0c;作者提出了CF…

数据结构(5.3_4)——线索二叉树的概念

普通二叉树找某结点前驱和后继的方法 中序线索二叉树 n个结点的二叉树&#xff0c;有n1个空链域!可用来记录前驱&#xff0c;后继的信息 中序线索二叉树的存储结构 //线索二叉树结点 typedef struct ThreadNode {ElemType data;struct BiTNode* lchild, * rchild;int ltag,…

大模型:AI领域的下一个风口

一、什么是大模型&#xff1f; 大模型&#xff0c;顾名思义&#xff0c;是指具有超大规模的神经网络模型。它们通常需要海量的数据和计算资源来训练和运行。典型的大模型有 GPT-3、BERT、AlphaFold 等&#xff0c;这些模型在自然语言处理、生物信息学等领域取得了显著的成果。…

商场导航系统:从电子地图到AR导航,提升顾客体验与运营效率的智能解决方案

商场是集娱乐、休闲、社交于一体的综合性消费空间&#xff0c;随着商场规模的不断扩大和布局的日益复杂&#xff0c;顾客在享受丰富选择的同时&#xff0c;也面临着寻路难、店铺曝光率低以及商场管理效率低下等挑战。商场导航系统作为提升购物体验的关键因素&#xff0c;其重要…

黄景仁,笔墨间的一抹清寒

黄景仁&#xff0c;字汉镛&#xff0c;一字仲则&#xff0c;号鹿菲子&#xff0c;生于乾隆十四年&#xff08;公元1749年&#xff09;&#xff0c;卒于乾隆四十八年&#xff08;公元1783年&#xff09;&#xff0c;享年仅35岁。他是宋代大诗人黄庭坚的后裔&#xff0c;出生于常…

deepseek-vl 论文阅读笔记

目录 一、已有模型性能差距分析 二、创新点 数据集构建 模型架构 训练策略 实验与评估 三、细节 数据构建 内部SFT数据的分类体系 模型架构 训练流程包括三个阶段 系统包含三个模块 混合视觉编码器 视觉-语言适配器 语言模型 训练策略 阶段一&#xff1a;训练…

AMQP-核心概念-3

本文参考以下链接摘录翻译&#xff1a; https://www.rabbitmq.com/tutorials/amqp-concepts 队列&#xff08;Queues&#xff09; AMQP 0-9-1模型中的队列和其他消息任务队列系统中的队列非常相似&#xff1a;它们用于存储被应用消费的消息。队列和交换机有一些相同的属性&…

【React】JSX:从基础语法到高级用法的深入解析

文章目录 一、什么是 JSX&#xff1f;1. 基础语法2. 嵌入表达式3. 使用属性4. JSX 是表达式 二、JSX 的注意事项1. 必须包含在单个父元素内2. JSX 中的注释3. 避免注入攻击 三、JSX 的高级用法1. 条件渲染2. 列表渲染3. 内联样式4. 函数作为子组件 四、最佳实践 在 React 开发中…

云计算实训室建设可行性报告

一、建设云计算实训室的目的和意义 随着信息技术的飞速发展&#xff0c;云计算作为一种新型的信息服务模式&#xff0c;已经成为推动信息技术创新和促进信息产业发展的重要力量。中高职院校作为培养高素质技能人才的重要基地&#xff0c;应当紧跟时代步伐&#xff0c;加强云计…

视觉-语言-行动模型:将网络知识迁移至机器人控制(RT-2论文翻译)

RT-2: Vision-Language-Action Models Transfer Web Knowledge to Robotic Control RT-2: 用互联网知识训练的视觉语言模型融入到机器人控制中 RT1 论文翻译&#xff1a; https://blog.csdn.net/weixin_43334869/article/details/135850410 文章目录 RT-2: Vision-Language…

关键词查找【Boyer-Moore 算法】

1、【Boyer-Moore 算法】 【算法】哪种算法有分数复杂度&#xff1f;- BoyerMoore字符串匹配_哔哩哔哩_bilibili BM算法的精华就在于BM(text, pattern),也就是BM算法当不匹配的时候一次性可以跳过不止一个字符。即它不需要对被搜索的字符串中的字符进行逐一比较&#xff0c;而…

AI绘画入门实践 | Midjourney:使用 --tile 制作面料纹理与壁纸背景图

在 Midjourney 中&#xff0c;--tile 生成可以连续平铺的图像&#xff0c;常用于面料墙纸与纹理的无缝图案。 使用格式&#xff1a;提示词 --tile 使用演示 a pink rose, clean background --tile --niji 5 无缝图检查工具&#xff1a;https://www.pycheung.com/checker/ 平铺…

文件共享功能无法使用提示错误代码0x80004005【笔记】

环境情况&#xff1a; 其他电脑可以正常访问共享端&#xff0c;但有一台电脑访问提示错误代码0x80004005。 处理检查&#xff1a; 搜索里输入“启用或关闭Windows功能”按回车键&#xff0c;在“启用或关闭Windows功能”里将“SMB 1.0/CIFS文件共享支持”勾选后&#xff08;故…

STM32智能家居控制系统教程

目录 引言环境准备智能家居控制系统基础代码实现&#xff1a;实现智能家居控制系统 4.1 数据采集模块 4.2 数据处理与分析模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;家居监测与优化问题解决方案与优化收尾与总结 1. 引言 智能家居控制系统通…

【数据结构--排序】

目录 一、排序概述1.1、排序的相关定义1.2、排序用到的结构与函数 二、常见排序算法2.1、冒泡算法&#xff08;交换顺序&#xff09;&#xff08;1&#xff09;算法&#xff08;2&#xff09;性能分析 2.2、简单选择排序&#xff08;1&#xff09;算法&#xff08;2&#xff09…

FastAPI(七十一)实战开发《在线课程学习系统》接口开发-- 查看留言

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 之前FastAPI&#xff08;七十&#xff09;实战开发《在线课程学习系统》接口开发--留言功能开发分享了留言开发&#xff0c;这次我们分享查看留言 梳…