数据结构回顾(Java)

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+树的对比

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot开发的AI导航站技术架构剖析 —— 技术如何选型 - 第520篇

历史文章&#xff08;文章累计520&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

C#与PLC通信——如何设置电脑IP地址

前言&#xff1a; 我们与PLC通过以太网通信时&#xff0c;首先要做的就是先设置好电脑的IP&#xff0c;这样才能实现上位机电脑与PLC之间的通信&#xff0c;并且电脑的ip地址和PLC的Ip地址要同处于一个网段&#xff0c;比如电脑的Ip地址为192.168.1.1&#xff0c;那么PLC的Ip地…

【Android面试八股文】请描述一下 android 的系统架构?

Android 是一个基于 Linux 的开源软件堆栈,针对多种不同设备类型打造。下图显示了 Android 平台的主要组件。 早期的Android架构如下图所示 官方网站最新的Android平台架构图,如下所示: Linux 内核 Android 平台的基础是 Linux 内核。例如,Android 运行时 (ART) 依赖…

css-grid布局(栅格布局)

css新世界-auto-fit grid 一个比flex更强大的布局,适合做整体布局 grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); auto-fit的话有strech效果gap 不仅可以用于grid 也可用flex. 在grid-template-areas表示这个位置空着grid area 的 [a b]命名可重复命名 表示的…

RHCA II之路---EX442-6

RHCA II之路---EX442-6 1. 题目2. 解题3. 确认 1. 题目 2. 解题 sysctl -a|grep shmall echo kernel.shmall 367001 >> /etc/sysctl.conf sysctl -p3. 确认 去人这里max total shared memory的值使我们之前设定的即可.这里的值单位是kb所以只需要2个1024就可以了 ipc…

如何快速区分电子原件极性

表贴式电阻电容无极性 1表贴式.二极管 如图所示:有横杠的表示负极&#xff08;竖杠标示&#xff09;&#xff0c;注意一定要查阅数据手册在引脚信息栏一般会有 铝电解电容 手册一般会对正负极有说明 钽电容有极性 发光二极管 芯片 一般规律&#xff1a;1.看丝印朝向正对丝印的…

监控易V7.6.6.15升级详解7,日志分析更高效

随着企业IT系统的日益复杂&#xff0c;日志管理成为了保障系统稳定运行、快速定位问题的重要工具。为了满足广大用户对日志管理功能的更高需求&#xff0c;监控易系统近日完成了重要版本升级&#xff0c;对日志管理功能进行了全面优化和新增。 一、Syslog日志与SnmpTrap日志统…

uniapp踩坑之项目:uni-table垂直居中和水平居中

uni-table 中的水平居中uni-td align"center" //html 水平居中<uni-table ref"table" :loading"loading" border stripe emptyText"暂无更多数据"><uni-tr><uni-th :width"tdWidth/6" align"center&quo…

7-Zip解压缩软件

7-Zip是一款完全免费而且开源的压缩软件&#xff0c;相比其他软件有更高的压缩比而且相对于WinRAR不会消耗大量资源 下载地址&#xff1a;7-Zip解压缩软件安装包_压缩软件安装包资源-CSDN文库

【Python3】自动化测试_用Playwright操作浏览器

创建浏览器实例 # 启动浏览器实例 myBrowser myPlaywright.chromium.launch(headlessFalse) # myBrowser myPlaywright.firefox.launch(headlessFalse) # myBrowser myPlaywright.webkit.launch(headlessFalse) args < List [ str ] >传递给浏览器实例的附加参数。 c…

仓颉语言 -- 函数

1、定义函数 仓颉使用关键字 func 来表示函数定义的开始&#xff0c;func 之后依次是函数名、参数列表、可选的函数返回值类型、函数体。其中&#xff0c;函数名可以是任意的合法标识符&#xff0c;参数列表定义在一对圆括号内&#xff08;多个参数间使用逗号分隔&#xff09;…

PyTorch论文

2019-12 PyTorch: An Imperative Style, High-Performance Deep Learning Library 设计迎合4大趋势&#xff1a; 1. array-based (Tensor) 2. GPU加速 3. 自动求导 (Auto Differentiation) 4. 拥抱Python生态 4大设计原则&#xff1a; 1. 使用算法和数据开发者熟悉的Python做编…

【Python学习笔记】:Python爬取音频

【Python学习笔记】&#xff1a;Python爬取音频 背景前摇&#xff08;省流可以不看&#xff09;&#xff1a; 人工智能公司实习&#xff0c;好奇技术老师训练语音模型的过程&#xff0c;遂请教&#xff0c;得知训练数据集来源于爬取某网页的音频。 很久以前看B站同济子豪兄的《…

开源AI生成连续一致性儿童故事书; GraphRAG结合本地版Ollama;AI辅助老年人用餐;开源无代码AI工作流VectorVein

✨ 1: SEED-Story SEED-Story 是一种能生成包含一致性图像的多模态长篇故事的机器学习模型&#xff0c;配套数据集已开放。 SEED-Story 是一种多模态长故事生成模型&#xff0c;具备生成包含丰富且连贯的叙事文本和一致性高的人物和风格图像的能力。此模型基于 SEED-X 构建。…

找到完美的横道图工具:2024年选择指南

国内外主流的10款项目进度横道图软件对比&#xff1a;PingCode、Worktile、灵动计划&#xff08;Wolai&#xff09;、飞书项目、Tapd、麦客CRM、Asana、Trello、Smartsheet、Basecamp。 在管理项目时&#xff0c;确保所有进度和任务都按计划进行是每个项目经理面临的一大挑战。…

iSAM: Incremental Smoothing and Mapping

文章目录 iSAM原理主要思想问题描述求解方法增量求解增量更新增量因式分解(基于[Givens Rotations](https://blog.csdn.net/weixin_41469272/article/details/140245327)) 回环处理数据association变量组合协方差 补充知识COLAMD排序算法原理步骤 JVC assignment iSAM原理 论文…

QT--控件篇二

一、文本框 1. QLineEdit 文本框通常使用QLineEdit和QTextEdit这两个类来实现。 QLineEdit&#xff1a;用于单行文本输入。QTextEdit&#xff1a;用于多行文本输入&#xff0c;可以包含丰富的文本格式。 用setText(QString txt);设置默认的显示内容&#xff0c;用QString tex…

Spring-Cache 缓存

1.简介 2.SpringCache 整合 简化缓存开发 1.导入依赖 <!-- spring cache --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency>2.redis 作为缓存…

c#与欧姆龙PLC通信——如何更改PLC的IP地址

前言 我们有时候需要改变欧姆龙Plc的ip地址,下图有两种更改方式,一种是已知之前Plc设置的Ip地址,还有一种是之前不知道Pl的Ip地址是多少,下面分别做介绍。 1、已知PLC的IP地址的情况下更改地址 假设已知PLC的Ip地址,比如本文中PLC的IP为192.168.1.2,我首先将电脑的IP地…

宝塔面板以www用户运行composer

方式一 执行命令时指定www用户 sudo -u www composer update方式二 在网站配置中的composer选项卡中选择配置运行