数据结构回顾(Java)

news2024/9/23 13:23:02

1.数组 线性表

定义的方式

int[] a=new int[10]

为什么查询快?

        1.可以借助O(1)时间复杂度访问某一元素,

        2.地址连续,逻辑连续

        3.数组长度一旦确定就不可以被修改

当需要扩容的时候需要将老数组的内容复制过来

在Java中数组是一个对象

ArrayList 数组列表

ArrayList的添加(自动扩容)

        对应的源码

        值得一看的是ensureCapacityInternal方法

        Ctrl+鼠标右键点进去

        看这个231行的这个方法,modCount这个不用关注,是并发下的一个计数,重点看234行的代码,minCapacity是新加入的值的位置,如果比数组的长度大就会执行grow(),数组扩容的方法

private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;//取到老的容量
    int newCapacity = oldCapacity + (oldCapacity >> 1);//构建新的容量,新的容量是老的容量的+老的容量右移一位(1.5倍)
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    elementData = Arrays.copyOf(elementData, newCapacity);//把老数组的值赋值给新的数组
}

底层就是构建了一个新的数组,并且把老的数组内容复制过来,从而就实现了自动扩容。

总结:初始容量是多少 10

扩容机制: 当elementData已经满了,才会扩容

扩容的方式:原容量加原容量右移一位

优点:随机访问,

缺点:需要连续的空间

2.链表

1.可以不断的扩容

2.由node结点组成,每个node由data和next组成

3.两种插入方式,头插法和尾插法

链表的构建,以及两种插入方法(头插法和尾插法)

class MySingleLinkedList{

    public Node head;

    class Node{
        public int value;
        public Node next;

        public Node(int value, Node next) {
            this.value = value;
            this.next = next;
        }
    }

    //头插法
    public void addFirst(int value){
        Node node =new Node(value, null);
        if (head==null){
            head=node;
        }else {
            node.next=head;
            head=node;
        }
    }
    //尾插法
    public void addEnd(int value){
        Node node=new Node(value,null);
        Node temp=head;
        if (head==null){
            head=node;
        }else {
            while (temp.next!=null){
                temp=temp.next;
            }
            temp.next=node;
        }

    }

    //循环输出
    public void loop(){
        Node temp=head;
        while (temp!=null){
            System.out.println(temp.value);
            temp=temp.next;
        }
    }
}

         Java中提供的LinkedList是一个双端的队列

        练习:

        leetcode中

               单链表的反转

                链表成环的判断、环的长度        

                两个有序链表的合并

3.二叉树

二叉树的三种遍历代码实现

前序遍历

中序遍历

后序遍历

 3.1 搜索二叉树

左边的节点比根小,右边的节点比根大(不保证平衡)

时间复杂度最好O(log(n)),最坏O(n)

3.2 平衡二叉树:

搜索二叉树基础上,任一节点的左右子树高度差不超过1.

LL旋转,RR旋转,LR旋转,RL旋转

3.3 红黑树:

红黑树是一棵近似平衡的二叉树,是一种高效的查找树。

所有的结点要么红色要么黑色,非黑即红

根结点是黑色的,叶节点是不存储数据的黑色 空结点

不能连续两棵红色相连

从任意结点到其所有的叶子结点所经过的黑色叶子结点数是一样的

推导出来,从红黑树的叶子结点到另一最近结点上的与到另一最远结点上,不超过一倍(任一结点的左右子树的高度差不超过两倍)

AVL树(平衡树)和红黑树的对比

AVL严格的平衡树,红黑树近似的平衡树

AVL在查询上更高效,红黑树在插入和删除上更高效

红黑树插入的时候默认结点是红色的,因为只是有可能会违反根叶黑或者不红红的规则

如果插入破坏了规则分以下三种情况:

1)插入结点是根节点

直接把根结点变黑

2)插入结点的叔叔是红色结点

父亲层和爷爷层同时变色,黑色变红色,红色变黑色,再看是否破坏红黑树的规则。

3)插入结点的叔叔是黑色

(LL,RR,LR,RL)旋转,然后变色,变色规则是旋转中心点,旋转点进行变色

LL:右旋,向右旋转,冲突的右孩变左孩

RR:左旋,向左旋转,冲突的左孩子变右孩子

LR: 左旋左孩子,然后右旋

RL:右旋右孩子,然后左旋

4.B树

红黑树虽然是近似平衡的,而且插入,删除上很高效,但是如果插入数据非常的多,也会出现树的深度过深,导致内存和磁盘间的I/O次数过多的情况,这时候就可以使用多叉树。

对于一个m叉树

(1)树中每个结点至多有m个孩子结点(m-1个关键字)

(2)每个结点的结构

(3)除根结点外,其他结点至少有m/2个孩子结点

(4)若根节点不是叶子结点,则根结点至少有两个孩子结点

(5)所有的叶子结点都在同一层上,即B树是所有结点的平衡因子等于0的多路查找树

B树的查找

首先我们要了解一个概念,我们读取磁盘中的数据时,是按照块或者页读取的,比如,一个word文档大小3.5K,它存储的时候会按照一个页的大小的整数倍去存储,存储占用4K,读取的时候也是一样的。

B树的访问结点是在硬盘上解决的,但是B树对结点内的数据的操作是在内存中使用的。

B树就是一次性去磁盘中读取一个块,数据,指针都在这个块里了

B+树

B+树就是在B树的基础上非叶子结点只存储记录和指针,叶子结点存储数据,B+树的元素个数和分支树是相同的,也就是一个元素值对应一个子树。

B+树的非叶子结点是为了快速定位到叶子结点上的关键字,就相当于给叶子结点层建立了索引。

整个B+树就是一个多级索引结构,目的就是为了加速查询的速度,查询的速度是log(n)级别的

B+树被广泛用作数据库的索引结构

B+树可以用于:顺序查找,随机查找,范围查找

B树和B+树的对比

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

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

相关文章

多样化数据可视化方法的全面示例:基于Python的多样化数据可视化

文章目录 前言代码效果展示 前言 本文演示了使用Python进行温度数据的多样化可视化方法。通过导入、处理和分析气象数据&#xff0c;我们生成了多种图表&#xff0c;包括直方图、核密度估计图、箱型图、小提琴图、条形图、山脊图、经验累积分布函数图和折线图。这些图表帮助我…

国内体外诊断行业翘楚『迈克生物』SRM项目启动,企企通赋能IVD产业打造高效采购供应链体系

IVD行业&#xff08;体外诊断行业&#xff09;在医疗领域被誉为“医生的眼睛”&#xff0c;是现代检验医学的重要构成部分&#xff0c;在临床应用中贯穿了疾病预防、初步诊断、治疗方案选择、疗效评价等疾病治疗的全过程&#xff0c;在现代医学疾病诊断中发挥着重要作用。 随着…

springboot1——快速构建项目

需求 第一步&#xff1a;创建maven工程(非web项目) 第二步&#xff1a;导入起步依赖 点击&#xff1a; 下拉复制&#xff1a; 粘贴&#xff1a;&#xff01;&#xff01;这是springboot工程需要继承的父工程 下拉复制&#xff1a; 粘贴&#xff1a;&#xff01;&#xf…

JAVA:常用的链表指南

请关注微信公众号&#xff1a;拾荒的小海螺 博客地址&#xff1a;http://lsk-ww.cn/ 1、简述 链表是一种常见的数据结构&#xff0c;它通过一系列节点&#xff08;Node&#xff09;来表示一个序列。每个节点包含数据和指向下一个节点的引用。链表的种类有很多&#xff0c;包括…

网络文件系统—NFS

目录 一、概述 二、NFS挂载原理 三、NFS相关协议及软件安装管理 1.协议&#xff1a; 2.软件&#xff1a; 四、NFS系统守护进程 五、NFS服务器的配置 六、NFS服务器的启动与停止 1. 启动NFS服务器 2.查询NFS服务器状态 3.停止NFS服务器 4.设置NFS服务器的自动启动状…

games103作业2(未完)

PBD方法 首先是每个质点的力的分析&#xff0c;不考虑碰撞和弹簧弹力的情况下&#xff0c;每个质点受重力的影响&#xff0c;所以需要对每个质点进行速度和位置的重力影响更新。 float t 0.0333f; float damping 0.99f; int[] E; float[] L; Vector3[] V; Vector3 gra…

【数学建模】——数学规划模型

目录 一、线性规划&#xff08;Linear Programming&#xff09; 1.1 线性规划的基本概念 1.2 线性规划的图解法 模型建立&#xff1a; 二、整数规划&#xff08;Integer Programming&#xff09; 2.1 整数规划的基本概念 2.2 整数规划的求解方法 三、非线性规划&#x…

<数据集>绝缘子缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2139张 标注数量(xml文件个数)&#xff1a;2139 标注数量(txt文件个数)&#xff1a;2139 标注类别数&#xff1a;8 标注类别名称&#xff1a;[insulator, broken disc, pollution-flashover, Two glass, Glassdirt…

220V降压5ⅤIC-AH8652

220V降压至5V的IC - AH8652 在电子设计中&#xff0c;电压转换是一个常见的需求&#xff0c;尤其是在需要将高电压转换为低电压以供电给微电子设备时。AH8652是一款专为降压转换设计的集成电路&#xff0c;它能够将220V的交流输入电压转换为稳定的5V直流输出&#xff0c;非常适…

Camunda如何通过外部任务与其他系统自动交互

文章目录 简介流程图外部系统pom.xmllogback.xml监听类 启动流程实例常见问题Public Key Retrieval is not allowed的解决方法java.lang.reflect.InaccessibleObjectException 流程图xml 简介 前面我们已经介绍了Camunda的基本操作、任务、表&#xff1a; Camunda组件与服务与…

spring6之容器:IOC

容器&#xff1a;IOC 控制反转&#xff08;Ioc&#xff09; IoC容器在Spring的实现 Spring 的 IoC 容器就是 IoC思想的一个落地的产品实现。IoC容器中管理的组件也叫做 bean。在创建 bean 之前&#xff0c;首先需要创建IoC 容器。Spring 提供了IoC 容器的两种实现方式&#xf…

华为HCIP Datacom H12-821 卷39

1.填空题 请2001 :0DB8:0000:C030:0000: 000: 09A0:CDEF地址进行压缩。() (若答案中存在字母&#xff0c;请采用大写格式) 参考答案&#xff1a;2001 :DB8:0:C030: :9A0:CDEF 解析&#xff1a; IPv6地址的表示方法 IPv6地址总长度为128比特&#xff0c;通常分为8组&#xff0c…

防御综合实验作业2

办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP NAT策略&#xff1a; 安全策略&#xff1a; 测试&#xff1a; 分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 是怎么转换的&#xff0c;首先分公司的用户需…

温度如何影响输入失调电压

目录 一、概念理解 二、仿真理解 一、概念理解 在手册中有这样一个参数&#xff1a;输入失调电压漂移&#xff08;input offset voltage drift / offset drift&#xff09; 以上图为例&#xff0c;这个参数理解为&#xff1a;常温下&#xff08;25℃&#xff09;每增减1摄氏度…

【STM32开发笔记】搭建VSCode+PyOCD的STM32开发环境

【STM32开发笔记】搭建VSCodePyOCD的STM32开发环境 一、安装软件1.1 安装STM32CubeMX1.2 安装VSCode1.3 安装Arm GNU Toolchain1.4 安装Make for Windows1.5 安装Python1.6 安装PyOCD 二、安装插件2.1 VSCode插件2.2 PyOCD支持包 三、创建项目3.1 创建STM32CubeMX项目3.2 查阅原…

PostgreSQL 中如何处理数据的并发读写和锁等待超时?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何处理数据的并发读写和锁等待超时一、并发读写的基本概念&#xff08;一&#xff09;…

org/openxmlformats/schemas/spreadsheetml/x2006/main/CTWorkbook$Factory

org/openxmlformats/schemas/spreadsheetml/x2006/main/CTWorkbook$Factory POI的问题 在操作Excel时&#xff0c;出现这个问题是因为缺少了poi-ooxml-schema jar包&#xff0c;并且与poi的jar包版本一致

html02-标签继续学习

1.列表标签 1.1 列表标签的使用场景 场景&#xff1a;在网页中按照 行 展示关联性的内容&#xff0c;如&#xff1a;新闻列表、排行榜、账单等 特点&#xff1a;按照行的方式&#xff0c;整齐显示内容 种类&#xff1a;无序列表、有序列表、自定义列表 1.2无序列表 <!--…

LPRNet 车牌识别部署 rk3588(pt-onnx-rknn)包含各个步骤完整代码

虽然车牌识别技术很成熟了&#xff0c;但完全没有接触过。一直想搞一下、整一下、试一下、折腾一下&#xff0c;工作之余找了一个简单的例子入个门。本博客简单记录一下 LPRNet 车牌识别部署 rk3588流程&#xff0c;训练参考 LPRNet 官方代码。 1、导出onnx   导出onnx很容易…

短剧营销:品牌传播的新风口?

7月10日&#xff0c;麦当劳首部短剧《重生之我在麦当劳修炼魔法》&#xff0c;在微信视频号、小红书、抖音等平台上线。这部短剧以「短剧脱口秀」 的模式&#xff0c;将麦当劳的品牌形象与「土味霸总」 的网络热点相结合&#xff0c;上线一小时内&#xff0c;全平台播放量破千。…