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

什么是顺序表?

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

顺序表的主要特点:

  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 LinearList {

    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的垃圾回收机制自动回收。

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

```java
public void add(E element, int index) {
// 如果索引不在有效范围内,抛出异常
if (index < 0 || index > size)
throw new IndexOutOfBoundsException("Index out of bounds");
// 如果当前元素数量达到容量,进行扩容

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/4609.html

(0)
LomuLomu
上一篇 2024 年 12 月 28 日 上午7:23
下一篇 2024 年 12 月 28 日 上午8:24

相关推荐

  • ChatGPT Plus续费扣款失败微信解决

    ChatGPT Plus续费扣款失败微信解决方法,适合Plus快到期或自动续费失败的用户。

    未分类 2026 年 5 月 22 日
    4500
  • 架构-初识BFF

    引言 晚上公司开了一个技术分享会,主要内容就是公司的项目架构,会中讲解了项目整体架构是BFF架构,就是在微服务之上多加了一层。 除此之外,还讲解了DDD设计思想,主要用于各个业务中台,如订单中台、用户中台等。 这是我的架构第一课,听得有些似懂非懂,于是浅浅地整理一下。 BFF 是什么 BFF是服务于前端的后端,全称Backend For Frontend。B…

    2024 年 12 月 30 日
    54800
  • ChatGPT Plus无需国外信用卡充值开通教程

    想把 ChatGPT Plus 开到自己的账号上,最现实的问题通常是支付方式。 国内用户更希望用微信或支付宝完成购买,再把会员开通到自己的原账号。下面的方式通过卡密和 Session 确认账号,适合想保留历史记录、工作资料和日常使用习惯的人。

    未分类 2小时前
    900
  • 【JVM】使用 IntelliJ IDEA 进行 Java 内存分析

    使用 IntelliJ IDEA 进行 Java 内存分析 前言 内存管理对于 Java 应用程序的性能至关重要,特别是在处理复杂的应用程序时,内存泄漏或内存溢出等问题可能导致性能下降甚至程序崩溃。在遇到这些问题时,内存分析工具能够帮助开发者快速定位和解决问题。IntelliJ IDEA 提供了内置的内存分析工具,可以方便地捕获并分析 Java 应用程序的内…

    未分类 2024 年 12 月 31 日
    1.6K00
  • Java集成Dify AI服务的客户端工具包

    项目源码 Dify Java SDK是为Java开发者设计的开源工具包,专门用于与Dify AI平台的无缝对接。该工具包全面覆盖了Dify平台的各项API功能,使开发者能够便捷地在Java应用中调用AI服务。 核心功能 本工具包具备以下主要特性: 1. 多场景应用支持 智能对话系统:通过专用接口实现多轮对话管理 文本自动生成:支持各类文本内容的智能创作 流程…

    未分类 2025 年 5 月 13 日
    79700

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信