Java基础学习笔记(十二)—— 数据结构

news2025/1/30 5:38:49

数据结构

  • 1 栈
  • 2 队列
  • 3 数组
  • 4 链表
  • 5 二叉树
    • 5.1 二叉树
    • 5.2 二叉查找树
    • 5.3 平衡二叉树
    • 5.4 红黑树
  • 6 哈希表

数据结构是计算机存储、组织数据的方式。是指相互之间存在一种或多种特定关系的数据元素的集合。

通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。

1 栈

栈是一种数据先进后出的模型

数据进入栈模型的过程称为:压/进栈
数据离开栈模型的过程称为:弹/出栈

2 队列

队列是一种数据先进先出的模型

数据从后端进入队列模型的过程称为:入队列
数据从前端离开队列模型的过程称为:出队列

3 数组

数组是一种查询快,增删慢的模型
在这里插入图片描述

查询数据时,通过地址值和索引定位,查询任意数据耗时相同,查询速度快
删除数据时,要将原始数据删除,同时后面每个数据前移,删除效率低
添加数据时,添加位置后的每个数据后移,再添加元素,添加效率极低

4 链表

链表是一种增删快,查询慢的模型

链表中的每一个元素称之为结点,如下图:

在这里插入图片描述

链表中第一个结点是头结点
在这里插入图片描述链表又可以分为:

  • 单向链表
    • 只能从前往后查找
  • 双向链表
    • 双向查找,离哪个近从哪个方向找

在这里插入图片描述

5 二叉树

5.1 二叉树

  1. 二叉树的特点:
  • 二叉树中,任意一个节点的度要小于等于2
    • 节点: 在树结构中,每一个元素称之为节点
    • 度: 每一个节点的子节点数量称之为度
  1. 二叉树结构图:

在这里插入图片描述

5.2 二叉查找树

  1. 二叉查找树的特点:
  • 二叉查找树,又称二叉排序树或者二叉搜索树
  • 每一个节点上最多有两个子节点
  • 左子树上所有节点的值都小于根节点的值
  • 右子树上所有节点的值都大于根节点的值
  1. 二叉查找树结构图:
    在这里插入图片描述
  2. 二叉查找树和二叉树对比结构图:

在这里插入图片描述
4. 二叉查找树添加节点:

  • 小的存左边
  • 大的存右边
  • 一样的不存

在这里插入图片描述

5.3 平衡二叉树

  1. 平衡二叉树的特点:
  • 二叉树左右两个子树的高度差不超过1
  • 任意节点的左右两个子树都是一颗平衡二叉树
  1. 平衡二叉树和二叉查找树对比结构图:

在这里插入图片描述

  1. 平衡二叉树旋转:
  • 旋转触发时机

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

    • 就是将根节点的右侧往左拉,原先的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点
      在这里插入图片描述
  • 右旋

    • 就是将根节点的左侧往右拉,左子节点变成了新的父节点,并把多余的右子节点出让,给已经降级根节点当左子节点
      在这里插入图片描述
  1. 平衡二叉树旋转的四种情况:
  • 左左

    • 旋转时机:当根节点左子树的左子树有节点插入,导致二叉树不平衡
    • 如何旋转:直接对整体进行右旋即可
  • 左右

    • 旋转时机:当根节点左子树的右子树有节点插入,导致二叉树不平衡
    • 如何旋转:先在左子树对应的节点位置进行左旋,在对整体进行右旋
  • 右右

    • 旋转时机:当根节点右子树的右子树有节点插入,导致二叉树不平衡
    • 如何旋转:直接对整体进行左旋即可
  • 右左

    • 旋转时机:当根节点右子树的左子树有节点插入,导致二叉树不平衡
    • 如何旋转:先在右子树对应的节点位置进行右旋,在对整体进行左旋

5.4 红黑树

  1. 红黑树概念:
  • 红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构。
  • 1972年出现,当时被称之为平衡二叉B树,后来,1978年被修改为如今的“红黑树”。
  1. 红黑树的特点:
  • 也称平衡二叉B树,是一种特殊的二叉查找树
  • 每一个节点上都有存储位表示节点的颜色,可以是红或者黑
  • 红黑树不是高度平衡的,它的平衡是通过“自己的红黑规则”进行实现的
  1. 红黑规则:
  • 每一个节点或是红色的,或者是黑色的
  • 根节点必须是黑色
  • 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为 Nil,这些 Nil 视为叶节点,每个叶节点 Nil 是黑色的
  • 如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连 的情况)
  • 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点

在这里插入图片描述

  1. 红黑树添加节点的默认颜色
  • 添加节点时,默认为红色,效率高(如果默认为黑色,添加三个元素,一共需要调整两次 )

在这里插入图片描述

  1. 红黑树添加节点后如何保持红黑规则
  • 根节点位置
    • 直接变为黑色
  • 非根节点位置
    • 父节点为黑色
      • 不需要任何操作,默认红色即可
    • 父节点为红色
      • 叔叔节点为红色
        1. 将“父节点”设为黑色,将“叔叔节点”设为黑色
        2. 将“祖父节点”设为红色
        3. 如果“祖父节点”为根节点,则将根节点再次变成黑色
      • 叔叔节点为黑色
        1. 将“父节点”设为黑色
        2. 将“祖父节点”设为红色
        3. 以“祖父节点”为支点进行旋转

6 哈希表

哈希表

  • JDK8之前,底层采用 数组 + 链表 实现

在这里插入图片描述

加载因子:本例中,当数组里面存了16*0.75=12个元素的时候,数组就会扩容为原来的两倍

  • JDK8之后,底层进行了优化,由 数组 + 链表 + 红黑树 实现
    • 节点个数少于等于8个:数组 + 链表
    • 节点个数多于8个:数组 + 红黑树(红黑树基于二叉排序树,小的跟左边比,打的跟右边比,提高了效率)

当挂在下面的元素过多,那么不利于添加,也不利于查询,所以在JDK8以后,当俩表长度超过8的时候,自动转换为红黑树,存储流程不变。

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【C++】stack queue priority_queue ...

🌈感谢阅读East-sunrise学习分享——stack & queue & 容器适配器 & prioity_queue & 反向迭代器 博主水平有限,如有差错,欢迎斧正🙏感谢有你 码字不易,若有收获,期待你的点赞关注&#x1f…

SAP ABAP增强 BADI的增强全解析

BADI的全称是Business Add-in,它的主要技术是基于ABAP的对象来实现增强。SAP中BADI的维护事务代码是SE18和SE19,SE18主要是创建及维护BADI对象,而SE19用于维护BADI的实例,即如何来实现BADI对象的功能。 SAP的BADI因系统版本的差别…

K8S Deployment 使用 更新 回滚 扩容

K8S Deployments 使用 & 更新 & 回滚 & 扩容 K8S Deployments 提供比 Replication Controller 、ReplicaSet 更高一级的抽象,也具备更丰富的功能。Deployment对象不仅创建pod,还确保集群中始终运行正确数量的pod,处理可伸缩性&a…

Esp8266+TFT太空人天气时钟

开源项目,只对动手能力有要求,有现成程序 b站演示视频: https://www.bilibili.com/video/BV1ND4y1W7oS/?spm_id_from333.999.0.0 效果图 模块和接线方法 使用ESP8266-12F模块,4M空间。OLED使用1.3寸IPS 240*240点阵彩屏,ST7789…

【Java集合】ArrayList源码分析

目录 一、ArrayList介绍 1.1 简介 1.2 继承体系 二、源码剖析 2.1 成员属性 2.2 构造方法 2.2.1 带int类型的构造方法:ArrayList(int initialCapacity) 2.2.2 无参构造方法:ArrayList() 2.2.3 Collection型构造方法:ArrayList(Collection c) …

flink规则引擎设计思路

在日常工作中我们经常收到一些诸如此类需求:“用户给点击了开屏广告,给用户下发私信”、“用户进入了推荐线,但在60秒内没有任何点击操作,弹框引导用户选择感兴趣的内容”、“用户点赞了某位作者的两篇以上的内容,但并…

C++入门----缺省参数和函数重载

C入门第一讲: 文章目录C入门第一讲:1.C关键字(C98)2.命名空间2.1命名空间的定义3.C的输入和输出4.缺省参数4.1缺省参数的概念4.2缺省参数的分类4.2.1全缺省参数4.2.2半缺省参数5.函数重载5.1函数重载的概念5.2C支持函数重载的原理…

在 SpringBoot 中 初步使用 MyBatis

这篇文章简单介绍如何初步使用MyBatis框架。MyBatis官网:mybatis – MyBatis 3 | 简介。本文中介绍MyBatis使用在SpringBoot中,Spring帮我们进行了管理,省去了获取sql的步骤。 什么是 MyBatis? MyBatis 是一款优秀的持久层框架&a…

XAML控件宽度为另一控件的一半、静态属性绑定、ObjectDataProvider

控件上当某些数据需要根据其他数据的变化而变化 很多时候,想让某个控件的宽度或者高度是另一个已有控件的一半,一开始打算使用ObjectDataProvider来实现,因为在控件上当某些数据需要根据其他数据的变化而变化时,可以使用ObjectDa…

Selenium实战【滑动验证码破解】【JAVA爬虫】

简介本文主要讲解,利用之前所学到的java selenium如何实战操作,浏览器控制鼠标,模拟人工操作滑动验证码。这里需要用javacv 的代码知识,用于计算图像中滑块需要移动的距离。实战目标网站:https://dun.163.com/trial/jigsaw操作流程…

【Java入门】Java注释和关键字

✅作者简介:CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1🏆 📃个人主页:hacker707的csdn博客 🔥系列专栏:Java入门 💬个人格言:不断的翻越一座又一…

mycat个人详谈

项目背景 现在业务想实现不同的用户分别看到不同的数据库,领导说用mycat中间件试试。没有接触过这个东西,刚拿到手直接头皮发麻,现在搞定了,索性就记录一下 Mycat数据库分库分表中间件 简介 阿里大牛开发的开源免费产品&#x…

设计模式——抽象工厂模式

文章目录1. 抽象工厂模式的定义2. 抽象工厂模式的类图3. 抽象工厂模式的作用4. 抽象工厂模式的实现1. 抽象工厂模式的定义 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。 抽象工厂允许客户使用抽象的接口来创建一组相关的产品&a…

OAuth 2.0简介

OAuth就是一种授权机制。数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的、一定权限的令牌(token),用来代替密码,供第三方应用使用。 流程 1.第三方客户端要求用…

【欧姆龙控制器NX1系列调研】

欧姆龙控制器NX1系列调研NX系列 NX1 CPU单元NX系列-EtherNet/IP耦合器单元NX系列-系统单元NX系列通信接口单元NX系列数字输入单元NX系列模拟量输入单元NX系列模拟量输出入单元NX系列 高速模拟量模块NX系列IO-Link 主站单元温度控制/温度输入单元位置接口单元NX系列 安全控制单元…

【algorithm】算法基础课---排序算法(附笔记 | 建议收藏)

🚀write in front🚀 📝个人主页:认真写博客的夏目浅石. 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:AcWing算法学习笔记 💬总结:希望你看完…

CSS入门四、浮动

零、文章目录 文章地址 个人博客-CSDN地址:https://blog.csdn.net/liyou123456789个人博客-GiteePages:https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee:https://gitee.com/bluecusliyou/TechLearnGithub:https:…

mybatis参数配置和日志详解

生命周期和作用域是至关重要的,因为错误的使用会导致非常严重的并发问题 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的,SqlSessionFactory的实例可以通过 SqlSessionFactoryBuilder 获得,而 SqlSessionFactoryBuild…

【stl容器--实践操作】

目录:前言一、string(一)初始化 、 赋值 、 拼接(二)单个字符的访问和修改[]、at()(三)插入和删除insert 、erase(四)查找和替换find、rfind、replace(五&…

代码随想录-47-101. 对称二叉树

目录前言题目1.递归思路2. 本题思路分析:3. 算法实现4. pop函数的算法复杂度5. 算法坑点前言 在本科毕设结束后,我开始刷卡哥的“代码随想录”,每天一节。自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。 代码随想录此题链接 题目…