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

news/2024/11/23 9:40:14/

数据结构

  • 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.ppmy.cn/news/11221.html

相关文章

html实现酷炫的公司年会抽奖(附源码)

文章目录1.设计来源1.1 主界面1.2 抽奖效果1.2 中奖效果2.效果和源码配置2.1 动态效果2.2 员工信息配置2.3 奖品信息配置2.4 抽奖音效配置2.5 源代码源码下载作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/128640998 ht…

二、TTY子系统框架

个人主页:董哥聊技术我是董哥,嵌入式领域新星创作者创作理念:专注分享高质量嵌入式文章,让大家读有所得!文章目录1、TTY子系统框架分析2、TTY数据处理流程3、驱动的目录结构及核心文件4、TTY在Linux下的分布1、TTY子系…

shell脚本练习2023年下岗版

shell脚本练习 1.判断指定进程的运行情况 #!/bin/bash NAMEhttpd #这里输入进程的名称 NUM$(ps -ef |grep $NAME |grep -vc grep) if [ $NUM -eq 1 ]; thenecho "$NAME running." elseecho "$NAME is not running!" fi2.判断用户是否存在 #!/bin/bash r…

软件测试---概念篇

本文主要介绍软件测试相关的一些基础概念.主要内容包括 : 什么是需求 什么是bug 什么是测试用例 开发模型和测试模型 配置管理和软件测试 一 : 什么是需求 满足用户期望或正式规定文档(合同、标准、规范)所具有的条件和权能,包含用户需求和软…

verilog学习笔记- 10)按键控制 LED 灯实验

目录 简介: 实验任务: 硬件设计: 程序设计: 下载验证 : 总结与反思: 简介: 按键开关是一种电子开关,属于电子元器件类。我们的开发板上有两种按键开关:第一种是本实…

用图记忆C语言中的运算符优先级

运算符优先级以及结合方向的统计表,网上到处可见。本文画了一张图,以便记忆! 1. 总体来说优先级 初级运算 > 单目运算 > 双目运算 > 三目运算 > 赋值运算 > 逗号运算 2. 双目细分 算术运算 > 位移运算 > 关系运算 &g…

判断两条线段是否相交

参考链接: 1 2 一、判断线段是否相交需要下面两步: (1)快速排斥实验 (2)跨立实验 二、第一步快速排斥实验 对上图两条L1,L2线段来说,L1 x的最大值为d端点x5,L2 x的最小值为a端点x…

切面AOP

1.2 AOP体系与概念 简单地去理解,其实AOP要做三类事: 在哪里切入,也就是权限校验等非业务操作在哪些业务代码中执行。 在什么时候切入,是业务代码执行前还是执行后。 切入后做什么事,比如做权限校验、日志记录等。 因…