【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问

news2024/11/18 13:59:21

目录

  • 一、虚拟头节点
  • 二、数组的随机访问
  • 三、动态数组、链表复杂度分析
  • 四、动态数组 add(E element) 复杂度分析
  • 五、动态数组的缩容

一、虚拟头节点

🌼 为了让代码更加精简,统一所有节点的处理逻辑,可以在最前面增加一个虚拟的头节点(不存储数据)

在这里插入图片描述
修改 node(int) 方法:

    /**
     * 返回 index 位置的节点
     */
    private Node<E> node(int index) {
        rangeCheck(index);

        // 从虚拟头节点的下一个节点开始寻找
        Node<E> moveNode = first.next;

        for (int i = 0; i < index; i++) {
            moveNode = moveNode.next;
        }

        return moveNode;
    }

修改添加和删除方法:

    @Override
    public void add(int index, E element) {
        rangeCheck4Add(index);

        // 拿到【index - 1】位置的节点
        Node<E> prev = (index == 0) ? first : node(index - 1);

        prev.next = new Node<>(element, prev.next);

        size++;
    }
    @Override
    public E remove(int index) {
        rangeCheck(index);

        Node<E> prev = (index == 0) ? first : node(index - 1);
        Node<E> node = prev.next;

        prev.next = node.next;

        size--;

        return node.element;
    }

在这里插入图片描述

二、数组的随机访问

在这里插入图片描述
🎉数组的随机访问速度非常快
🎉elements[n] 的效率与 n 是多少无关

三、动态数组、链表复杂度分析

在这里插入图片描述

🎉 这里的链表是单链表

四、动态数组 add(E element) 复杂度分析

在这里插入图片描述

🎉 扩容操作不是每次都会发生

在这里插入图片描述

  • 什么情况下适合使用均摊复杂度?
    🎉经过连续的多次复杂度比较低的情况后,出现个别复杂度比较高的情况

五、动态数组的缩容

🎁 如果内存使用比较紧张,动态数组有比较多的剩余空间,可以考虑进行缩容操作

🎁 比如剩余空间占总容量的一半时,就进行缩容(size 大于总容量的一半的时候进行缩容)

🎁 缩容操作在动态数组的删除方法中进行

  private void trim() {
       int oldCapacity = elements.length;
       int halfCapacity = oldCapacity >> 1;
       // size 大于总容量的一半, 总容量小于等于默认容量的时候不缩容
       if (size >= halfCapacity || oldCapacity <= DEFAULT_CAPACITY) return;

       E[] newElements = (E[]) new Object[halfCapacity];

       for (int i = 0; i < size; i++) {
           newElements[i] = elements[i];
       }

       elements = newElements;

       System.out.println(oldCapacity + "缩容为" + halfCapacity);
   }

🎁 如果扩容倍数、缩容时机设计不得当,有可能会导致复杂度震荡

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

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

相关文章

2023 年最佳 C++ IDE

文章目录 前言1. Visual Studio2. Code::Blocks3. CLion4. Eclipse CDT&#xff08;C/C 开发工具&#xff09;5. CodeLite6. Apache NetBeans7. Qt Creator8. Dev C9. C Builder10. Xcode11. GNAT Programming Studio12. Kite总结 前言 要跟踪极佳 IDE&#xff08;集成开发环境…

嵌入式系统复习要点

目录 1、嵌入式系统的核心部分主要由硬件和软件两部分组成&#xff1a; 2、嵌入式系统硬件&#xff1a; 3、嵌入式处理器从体系上分类&#xff0c;可以分为冯诺依曼结构和哈佛结构两种&#xff1a; 4、几类常见的嵌入式处理器类型&#xff1a; 5、MCU组成结构&#xff1a;…

chatgpt赋能python:介绍:Python经典小游戏合集

介绍&#xff1a;Python经典小游戏合集 作为一门简洁易学、受到广泛喜爱的编程语言&#xff0c;Python已经在各个领域中得到了广泛应用&#xff0c;包括游戏开发。在这篇文章中&#xff0c;我们将为您介绍一些Python编程中的经典小游戏&#xff0c;让您感受到Python的多功能性…

idea乱码的相关问题

idea控制台乱码&#xff08;即&#xff1a;tomacat等启动时的乱码&#xff09; 第一步&#xff1a; 控制台tomcat启动信息乱码解决&#xff08;红色字体&#xff09; 1 在本地 tomcat 的配置文件中找到 logging.properties 文件设置日志输出的编码为 UTF-8 追加的配置信息为…

【Android复习笔记】Handler机制(一)

从 Android 初学者常见的一个错误开始: 导致这个错误的代码通常长下面这样: new Thread(){@Overridepublic void run() {new Handler(); } }.

chatgpt赋能python:Python编程中常见的问题和解决方案

Python编程中常见的问题和解决方案 Python作为一门高级编程语言&#xff0c;广泛用于数据分析、人工智能、Web开发等领域&#xff0c;然而在实际应用中我们不可避免地会遇到许多问题。在本文中&#xff0c;我们将探讨一些常见的Python编程问题以及解决方案。 1. 编码问题 Py…

碰撞检测算法详述

算法的分类 目录 一、基于空间域的碰撞检测算法分类 1. 基于图像空间的碰撞算法 2.基于几何空间的碰撞检测算法 &#xff08;1&#xff09;基于空间剖分算法 &#xff08;2&#xff09;裁剪扫掠法 &#xff08;3&#xff09;基于距离场的算法 &#xff08;4&#xff09;…

ModaHub魔搭社区:向量数据库的工作原理

目录 1. 为什么需要向量数据库 1&#xff09;CPU 工作原理 2&#xff09;GPU 工作原理 3&#xff09;二者的差异 4&#xff09;总结 5&#xff09;大模型的工作原理 学习 推理 1. 为什么需要向量数据库 向量数据库这一概念随着黄仁勋的演讲火爆了之后&#xff0c;不少…

如何使用upupw搭建服务器,并映射外网访问

作为计算机行业从业人员&#xff0c;相信很多人都接触并使用过phpstudy等类似环境集成包&#xff0c;着对于upupw就比较好理解了。UPUPW绿色服务器平台是Windows下很有特色的一款免费服务器PHP套件&#xff0c;UPUPW PHP套件简化了PHP环境搭建步骤&#xff0c;一个压缩包解压到…

chatgpt赋能python:Python经典游戏:从命令行到桌面

Python经典游戏&#xff1a;从命令行到桌面 Python是一个热门的编程语言&#xff0c;尤其在编写游戏方面表现出色。Python允许开发人员使用简单的语法和丰富的库编写高效率的游戏。在这篇文章中&#xff0c;我们将介绍Python的一些经典游戏&#xff0c;包括简单的命令行游戏和…

GithubAction的使用-简单易懂

一、Github Action简介 github Action &#xff08;工作流&#xff09;&#xff0c;简单理解就是自动化部署、测试。也就是之前人工手动部署变为现在由机器&#xff08;服务器&#xff09;自动部署、测试了。 二、对github Action&#xff08;工作流&#xff09;的使用 首先…

〖编程初学者的自我修养 - 满分面试篇①〗- 面试之前需要做的「长期准备工作」

简介&#xff1a;应 850 小伙伴要求&#xff0c; 无论你是迷茫的在校生还是已经就业的老司机&#xff0c;该专栏都值得你订阅&#xff0c;它会让你成就更好的自己&#xff01;说明&#xff1a;该文属于 编程初学者的自我修养 专栏&#xff0c;购买任意白宝书体系化专栏可加入易…

SpringBoot 解决跨站脚本漏洞(XSS)问题

一、问题背景 使用 SpringBoot 的项目出现了跨站脚本漏洞&#xff08;XSS&#xff09;问题。 二、解决方案 步骤如下&#xff1a; 1、添加maven依赖 在 pom.xml 文件中&#xff0c;增加如下依赖&#xff1a; <dependency><groupId>org.apache.tomcat</group…

莫兰指数P值,Z值分析

仔细看完下面两个链接绝对可以明白。写的非常清晰。 白话空间统计之四&#xff1a;P值和Z得分&#xff08;中&#xff09; 白话空间统计之四&#xff1a;P值和Z得分&#xff08;下&#xff09; 个人理解&#xff1a;P值决定了数据有没有显著性&#xff0c;数据能不能用的问题…

什么是 CI/CD ?

说在开头 CI、CD 其实是三个概念&#xff0c;包含了一个 CI 和两个 CD&#xff0c;CI全称 Continuous Integration&#xff0c;表示持续集成&#xff0c;CD包含 Continuous Delivery和 Continuous Deployment&#xff0c;分别是持续交付和持续部署。这三个概念之间是有前后依赖…

chatgpt赋能python:Python如何等分区间

Python如何等分区间 Python是一种高级编程语言&#xff0c;经常用于数据分析和科学计算。在数据分析中&#xff0c;等分数据区间是常见的操作。本文将介绍Python如何等分区间&#xff0c;并提供一些实用的代码示例。 什么是等分区间 等分数据区间是将数据划分为几个大小相等…

网络编程的无冕之王-Netty入门和核心组件介绍

最近我在研究Netty&#xff0c;之前只是经常听说&#xff0c;并没有实际做过研究&#xff0c;为什么突然要好好研究一下它&#xff0c;主要是因为前段时间&#xff0c;我在看RocketMQ底层原理的时候发现它的底层的网络通信都是基于Netty&#xff0c;然后网上一查&#xff0c;果…

【软件设计师暴击考点】网络安全等杂项高频考点暴击系列

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…

读发布!设计与部署稳定的分布式系统(第2版)笔记11_无限长的结果集

1. 无限长的结果集是导致响应缓慢的常见原因 1.1. 当违反稳态模式时&#xff0c;就可能产生无限长的结果集 1.2. 当调用方允许另一个系统支配调用时&#xff0c;就会出现一个无限长的结果集 2. 数据库突然返回500万行&#xff0c;而不是通常的100多行时会发生什么&#xff1…

密码找回流程绕过测试-业务安全测试实操(20)

密码找回流程绕过测试 测试原理和方法 很多网站的密码找回功能一般有以下几个步骤 (1) 用户输入找回密码的账号: (2) 校验凭证:向用户发送短信验证码或者找回密码链接,用户回填验证码或单击链接进入密码重置页面,以此方式证明当前操作用户是账号主人;(3) 校验成功进入重置密…