Java集合进阶——数据结构

1.栈

模型:

        栈模型和一个杯子差不多,一端开口,一端封闭,开口的那端叫栈顶,封闭的那端叫栈底,如图所示

介绍:

        元素进入栈中叫进栈/压栈,元素出来叫出栈,元素进栈后会先来到栈底,再进栈的元素会垒到上一个进栈的元素的上方,距离栈顶最近的即最上方的元素为栈顶元素,每次出栈就是将栈顶元素出栈。可以理解为向弹夹中压子弹。

特点:

        栈的特点是先进后出,后进先出,即先进去的元素会后出来,后进去的元素先出来

2.队列

模型:

        队列模型两端都是开口的,一端为前端,一端为后端

介绍:

        元素进入队列从后端进,会先来到最靠近前端的位置,后续元素继续进入队列会排到前一个元素的后面,元素出队列会从前端出,最靠近前端的元素先出。可以理解为排队的队伍。

特点:

        队列的特点是先进先出,后进后出。

3.数组

模型:

特点:

        数组中的元素在内存中是连续存储的。

        查询速度快:通过地址值和索引定位查询数据,查询任意数据耗时相同

        删除效率低:要将原始数据删除,还需将后面每个数据前移

        添加效率低:添加数据后的每个数据需后移,再添加元素

4.链表

介绍:

链表中的元素为结点,每个结点中都要存储具体的数据和下一个结点的地址,如下图所示。

模型:        

        在链表中第一个创建出来的结点为头结点,头结点创建完后,他可以存储具体的数据,同时下一个结点的地址存储的为^,表示空地址,因为这个结点后面没有其他结点了。

        如果已经创建了一个链表的头结点,需要再添加一个数据A,那么接下来的步骤应该是先创建一个新的结点,新结点存储数据A,下一个结点地址为^,然后将头结点存储的下一个结点的地址赋值为新结点的地址。如下图所示

        再添加数据C和数据D呢,如下图所示

特点:

        链表中的结点是独立的对象,在内存中是不连续的,每个结点包含数据值和下一个结点的地址。

        (相较于数组来说)

        查询慢,无论查询哪个数据都要从头开始找。

        增删块,只需改变存储的下一个结点的值加删除结点就能完成增删操作。

双向链表模型:

5.树

        模型:

        如图所示,树是由节点(结点)组成,16是15和17的父节点,15是16的左子节点,17是16的右子节点。

        而每个节点中存储的值由下图所示

        每个节点中都存储着自己存储的值,父节点地址,左子节点地址,右子节点地址。若哪个节点没有,那么存储的地址值置为null。

术语:

        度:每一个节点的子节点数量

       

        树高:树的总层数,上文中的树树高为4,从上到下依次为第一层、第二层、第三层、第四层

        根节点:最顶层的节点,上文中的树即22

        左子节点:左下方的节点

        右子节点:右下方的节点

        根节点的左子树:根节点的左下方节点及其下方的所有节点连接起来的树

        根节点的右子树:根节点的右下方节点及其下方的所有节点连接起来的树

二叉树
        规则:

                每一个节点的子节点数<=2

        模型:

二叉树遍历方式:
(1)前序遍历

        前序遍历即从根节点开始,按照当前节点、左子节点、右子节点的顺序遍历。

        例如下图二叉查找树

其前序遍历的结果为 20,18,16,19,23,22,24

(2)★中序遍历

        从最左边的子节点开始,然后按照左子节点,当前节点,右子节点的顺序遍历

        例如下图二叉查找树

        其中序遍历的结果为 16,18,19,20,22,23,24(这种遍历方法遍历二叉查找树得到的结果是由小到大的)

(3)后序遍历

        从最左边的子节点开始,然后按照左子节点,右子节点,当前节点的顺序遍历

        例如下图二叉查找树

        其后序遍历的结果为 16,19,18,22,24,23,20

(4)层序遍历

        从根节点开始,一层一层的遍历

        例如下图二叉查找树

        其层序遍历的结果为 20,18,23,16,19,22,24

二叉查找树(又叫做二叉排序树或二叉搜索树)
        普通二叉树的弊端:

                数据没有规律,查找很难,必须要遍历才能查找,效率很低,所以有了二叉查找树。

        特点:

                1.每一个节点上最多有两个子节点(即是二叉树)

                2.任意节点左子树上的值都小于当前节点

                3.任意节点右子树上的值都大于当前节点

        模型:

添加节点规则:

        从根节点开始逐个往下层比,小的放左边,大的放右边,重复的不放

查找结点规则:

        从根节点开始逐个往下层比,查找元素比节点小跟其左子节点继续比,查找元素比节点大跟其右子节点继续比,直到找到或者节点的子节点为空,即没找到。

二叉查找树的弊端:

        如果按顺序添加的元素正好是逐渐增大的,那么第一个元素为根节点,其他所有元素都会逐个排到最下层节点的右子节点位置,这样如果要查找最大的那个数据,查找效率还是很低,所以有了二叉平衡树。

平衡二叉树
        规则:

                任意节点的左右子树高度差不超过1

        模型:

        平衡二叉树的旋转机制:

                平衡二叉树通过旋转机制来保证任意节点的左右子树高度差不超过1

        触发机制:

                当添加一个节点后,该树不再是一颗平衡二叉树

        旋转方式:
        1.左旋

        支点不是根节点情况:

        ①确定支点:从添加的节点开始,不断的往父节点找不平衡的节点(左右子树高度差超过1)

        ②把支点左旋降级,变成左子节点

        ③晋升原来的右子节点

        如图:

变成

        支点为根节点:

        ①确定支点:从添加的节点开始,不断的往父节点找不平衡的节点(左右子树高度差超过1)

        ②将根节点的右侧往左拉

        ③原来的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子    节点

        如图:

变成

        2.右旋

        支点不是根节点情况:

        ①确定支点:从添加的节点开始,不断的往父节点找不平衡的节点(左右子树高度差超过1)

        ②把支点右旋降级,变成右子节点

        ③晋升原来的左子节点

        如图:

变成

        支点为根节点:

        ①确定支点:从添加的节点开始,不断的往父节点找不平衡的节点(左右子树高度差超过1)

        ②将根节点的左侧往右拉

        ③原来的左子节点变成新的父节点,并把多余的右子节点出让,给已经降级的根节点当左子    节点

        如图:

变成

平衡二叉树需要旋转的四种情况:
        1.左左

                当根节点的左子树的左子树有节点插入,导致二叉树不平衡

        这种情况需要进行一次右旋

        如图:

变成                         ↓                                                                                     ↓

        2.左右

                当根节点的左子树的右子树有节点插入,导致二叉树不平衡

        这种情况需要对根节点的左子树进行一次左旋,再整体进行一次右旋

        如图:

变成变成

        3.右右

                当根节点的右子树的右子树有节点插入,导致二叉树不平衡

        这种情况需要进行一次左旋

        如图:

变成

        4.右左

                当根节点的右子树的左子树有节点插入,导致二叉树不平衡

        这种情况需要对根节点的右子树进行一次右旋,再整体进行一次左旋

        如图:

变成变成

红黑树

        红黑树是一种自平衡的二叉查找树,它的每一个节点上都有存储位表示节点的颜色,每一个节点可以是红是黑,它不是高度平衡的,它的平衡是通过“红黑规则”进行实现的。

        红黑树的增删改查性能都很好

红黑规则:

        ①每一个节点都是红色或者黑色

        ②根节点必须是黑色

        ③如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节             点,每个叶节点(Nil)都是黑色的

        ④如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情                 况)

        ⑤对每一个节点,从该节点到其所有后代叶节点简单路径上,均包含相同数目的黑色节点

                (后代叶节点:该节点下面的叶节点        简单路径:只能前进不能回头的路径)

模型:

红黑树添加节点规则:

        首先要满足红黑规则

        添加节点时,添加的节点默认为红色的,添加效率更高

        下面是一些情况的解决方案:

(旋转时不用管叶节点,旋转后加上叶节点即可)

        

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

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

相关文章

Appian发布最新版本:通过AI流程自动化推动业务发展

Appian公司于2024年4月16日在弗吉尼亚州麦克莱恩宣布推出Appian平台的最新版本。此版本引入了Process HQ&#xff0c;这是一个集流程挖掘和企业AI于一体的系统&#xff0c;结合了Appian的数据平台。Process HQ为企业运营提供前所未有的可见性&#xff0c;支持数据驱动的决策和流…

CERLAB无人机自主框架: 2-动态目标检测与跟踪

前言&#xff1a;更多更新文章详见我的个人博客主页【MGodmonkeyの世界】 描述&#xff1a;欢迎来到CERLAB无人机自主框架&#xff0c;这是一个用于自主无人飞行器 (UAV) 的多功能模块化框架。该框架包括不同的组件 (模拟器&#xff0c;感知&#xff0c;映射&#xff0c;规划和…

Hadoop——Yarn 调度器和调度算法

Yarn 调度器和调度算法 YARN调度器&#xff08;Scheduler&#xff09;是负责将集群资源分配给不同应用程序的组件。它根据应用程序的资源需求和优先级&#xff0c;以及集群的资源供给情况&#xff0c;决定如何分配资源。YARN提供了多种调度器实现&#xff0c;每种调度器都有不…

如何通过MSTSC连接Ubuntu的远程桌面?

正文共&#xff1a;666 字 12 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面我们介绍了如何通过VNC连接Ubuntu 18.04的远程桌面&#xff08;Ubuntu 18.04开启远程桌面连接&#xff09;&#xff0c;非常简单。但是有小伙伴咨询如何使用微软的远程桌面连接MSTSC&#xff08…

Go栈内存管理源码解读

基本介绍 栈内存一般是由Go编译器自动分配和释放&#xff0c;其中存储着函数的入参和局部变量&#xff0c;这些参数和变量随着函数调用而创建&#xff0c;当调用结束后也会随之被回收。通常开发者不需要关注内存是分配在堆上还是栈上&#xff0c;这部分由编译器在编译阶段通过…

Android Studio学习笔记——广播机制Broadcast

Android Studio学习笔记——广播机制 5.1 广播机制简介5.2 接收系统广播5.2.1 动态注册监听网络变化5.2.2 静态注册实现开机启动 5.3 发送自定义广播5.3.1 发送标准广播5.3.2 发送有序广播 5.4 使用本地广播5.5 广播的最佳实践——强制下线功能 5.1 广播机制简介 安卓每个应用…

spring boot后端开发基础

spring boot后端开发基础 Spring Boot一、开发步骤二、Web分析三、跨域问题四、HTTP协议五、Web服务器六、响应前端请求七、springboot常用注解创建一个简单的RESTful API服务层和数据访问层配置类和Bean定义响应体和路径变量 Spring Boot 一、开发步骤 创建项目 添加依赖 项…

k8s部署Eureka集群

部署有状态负载 镜像配置&#xff1a; 环境变量如下&#xff1a; AUTHENTICATE_ENABLEtrue JAVA_OPTS-Dauth.userName账号 -Dauth.password密码 MY_POD_NAMEmetadata.name BOOL_REGISTERtrue BOOL_FETCHtrue APPLICATION_NAME负载名称 EUREKA_INSTANCE_HOSTNAME${MY_POD_NA…

webpack源码分析——enhanced-resolve库之getType、normalize、join和cachedJoin函数

一、PathType 路径类型 const PathType Object.freeze({Empty: 0, // 空Normal: 1, // 默认值Relative: 2, // 相对路径AbsoluteWin: 3, // win 下的绝对路径AbsolutePosix: 4, // posix 下的绝对路径Internal: 5 // enhanced-resolve 内部自定义的一种类型&#xff0c;具体是…

小程序AI智能名片S2B2C商城系统:做内容、造IP、玩社群打造私域流量的新营销秘籍

在数字化浪潮汹涌的新时代&#xff0c;小程序AI智能名片S2B2C商城系统正以其独特的魅力&#xff0c;引领着营销领域的新变革。这套系统不仅将人工智能与小程序技术完美结合&#xff0c;更通过创新的S2B2C模式&#xff0c;为企业打开了一扇通往成功的大门。 面对激烈的市场竞争&…

SQL注入作业

目录 一、万能密码和二阶注入测试 1.万能密码 2.二阶注入测试 二、联合查询注入测试 1.判断注入点 2.判断当前查询语句的列数 3.查询数据库基本信息 4.查询数据库中的数据 三、报错注入 1. 报错注入函数EXTRATVALUE 2.UPDATEXML 四、盲注测试 1.布尔盲注 判断数据…

Linux搭建Discuz论坛

搭建一个论坛 —接上篇博客 改名/etc/httpd/conf.d/vhosts.conf 》/etc/httpd/conf.d/vhosts.conf.bak [rootlocalhost conf.d]# mv /etc/httpd/conf.d/vhosts.conf /etc/httpd/conf.d/vhosts.conf.bak此时的vhosts.conf是一个新创建的文件&#xff0c;之前的vhosts.conf已经…

使用 Godot 游戏引擎为 Apple 的 visionOS 创建游戏和应用的平台

借助GodotVision ,您可以使用Godot 游戏引擎为 Apple VisionOS创建游戏和应用程序。 保卫牛城堡,一款使用 GodotVision 制作的 VisionOS 游戏 GodotVision 运行一个控制本机RealityKit 视图的无头 Godot实例。粗略地说:Godot 是后端,

毅速3D打印随形透气钢:革新传统,引领未来

透气钢&#xff0c;这种多孔金属材料&#xff0c;既融合了金属材料的坚固性&#xff0c;又具备了透气材料的通透性。尤其在注塑模具的制造中&#xff0c;透气钢的作用不可忽视。通过镶嵌透气钢&#xff0c;能够有效解决因困气产生的注塑问题&#xff0c;使成型加工更为完善&…

机器学习鸢尾花使用csv

操作流程 下载鸢尾花数据集导入需要的包读取数据并查看数据大小和长度划分训练集和测试集使用模型评估算法 下载鸢尾花数据集 链接&#xff1a;https://pan.baidu.com/s/1RzZyXsaiJB3e611itF466Q?pwdj484 提取码&#xff1a;j484 --来自百度网盘超级会员V1的分享导入需要…

矩阵混乱度(熵值)代码计算

1、先回顾下熵值的数据公式&#xff1a; 2、jax.numpy代码 注意的点&#xff1a;熵值计算的输入的必须是归一化的正值 import jax.numpy as jnp import jax def _entroy(probs):log_probs jnp.log2(jnp.maximum(1.0e-30, probs))mean_sum_plogp jnp.mean(- jnp.sum(log_pro…

vscode+vue开发常用插件整理

前言&#xff1a; vscode新机开发常用插件整理 1、chinese 简体中文配置 2、file-jump 别名跳转&#xff0c;可以把引入的组件&#xff0c;通过ctrl地址名 跳转组件内部 3、Vue Peek&#xff1a;vue项目中的一些配置&#xff0c;安装后&#xff0c;能实现 ctrl组件名 跳转…

Golang图像处理实战:image/png包的应用详解

Golang图像处理实战&#xff1a;image/png包的应用详解 介绍基本操作读取PNG文件保存PNG文件 处理图像数据修改图像像素图像裁剪和缩放 高级功能使用 image/color 处理颜色优化PNG性能 错误处理与调试常见错误及其解决方法文件无法打开图像解码失败 使用工具和库进行调试 结语 …

测试数据整理--chatgpt 构造sql语句导出数据库数据

在测试过程中&#xff0c;我们有时候需要准备一些测试数据&#xff0c;若从系统中直接导出Excel数据&#xff0c;数据往往庞大且需要整合&#xff0c;不好整理&#xff0c;于是我们直接去数据库中查询一些表&#xff0c;数据整合后直接导出结果会更方便。 我们今天就 用 chatg…

shell 调用钉钉通知

使用场景&#xff1a;机器能访问互联网&#xff0c;运行时间任务后通知使用 钉钉建立单人群 手机操作&#xff0c;只能通过手机方式建立单人群 电脑端 2. 配置脚本 #!/bin/bash set -e## 上图中 access_token字段 TOKEN KEYWORDhello # 前文中设置的关键字 function call_…