大厂Mysql高频面试题!javabmi计算公式

2023-11-01 06:20

本文主要是介绍大厂Mysql高频面试题!javabmi计算公式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

二、面试题

面:考你几个红黑树的知识点🦀

  1. 红黑树的数据结构都用在哪些场景,有什么好处?
  2. 红黑树的时间复杂度是多少?
  3. 红黑树中插入新的节点时怎么保持平衡?

面:2-3树都是不没看,回去等消息吧!

三、2-3树与红黑树的等价性

红黑树规则

1. 根节点是黑色
2. 节点是红黑或者黑色
3. 所有子叶节点都是黑色(叶子是NIL节点,默认没有画出来)
4. 每个红色节点必须有两个黑色子节点(也同样说明一条链路上不能有链路的红色节点)
5. 黑高,从任一节点到齐每个叶子节点,经过的路径都包含相同数目的黑色节点

那么,这些规则是怎么总结定义出来的呢?接下里我们一步步分析讲解。

1. 为什么既有2-3树要有红黑树

首先2-3树(读法:二三树)就是一个节点有1个或者2个元素,而实际上2-3树转红黑树是由概念模型2-3-4树转换而来的。-4叉就是一个节点里有3个元素,这在2-3树中会被调整,但是在概念模型中是会被保留的。

虽然2-3-4树也是具备2-3树同样的平衡树的特性,但是如果直接把这样的模型用代码实现就会很麻烦,且效率不高,这里的复杂点包括;

  1. 2-叉、3-叉、4-叉,三种结构的节点类型,互相转换复杂度较高
  2. 3-叉、4-叉,节点在数据比较上需要进行多次,不像2-叉节点,直接布尔类型比较即可非左即右
  3. 代码实现上对每种差异,都需要有额外的代码,规则不够标准化

所以,希望找到一种平衡关系,既保持2-3树平衡和O(logn)的特性,又能在代码实现上更加方便,那么就诞生了红黑树。

2. 简单2-3树转红黑树

2-3树转红黑树,也可以说红黑树是2-3树2-3-4树的另外一种表现形式,也就是更利于编码实现的形式。

简单转换示例;

从上图可以看出,2-3-4树与红黑树的转换关系,包括;

  1. 2-叉节点,转换比较简单,只是把原有节点转换为黑色节点
  2. 3-叉节点,包括了2个元素,先用红色线把两个节点相连,之后拆分出来,最后调整高度黑色节点在上
  3. 4-叉节点,包括了3个元素,分别用红黑线连接,之后拆分出来拉升高度。这个拉升过程和2-3树调整一致,只是添加了颜色

综上,就是2-3-4树的节点转换,总结出来的规则,如下;

  1. 将2-3-4树,用二叉树的形式表示
  2. 3-叉、4-叉节点,使用红色、黑色连线进行连接
  3. 另外,3-叉节点有两种情况,导致转换成二叉树,就有左倾和右倾

3. 复杂2-3树转红黑树

简单2-3树转换红黑树的过程中,了解到一个基本的转换规则右旋定义,接下来我们在一个稍微复杂一点的2-3树与红黑树的对应关系,如下图;

上图是一个稍微复杂点的2-3树,转换为红黑树的过程,是不这样一张图让你对红黑树更有感觉了,同时它也满足一下条件;

  1. 从任意节点到叶子节点,所经过的黑色节点数目相同
  2. 黑色节点保持着整体的平衡性,也就是让整个红黑树接近于O(logn)时间复杂度
  3. 其他红黑树的特点也都满足,可以对照红黑树的特性进行比对

四、红黑树

1. 平衡操作

通过在上一章节2-3树的学习,在插入节点时并不会插到空位置,而是与现有节点融合以及调整,保持整个树的平衡。

而红黑树是2-3-4树的一种概念模型转换而来,在插入节点时通过红色链接相连,也就是插入红色节点。插入完成后进行调整,以保持树接近平衡。

那么,为了让红黑树达到平衡状态,主要包括染色、↔左右旋转、这些做法其实都是从2-3树演化过来的。接下来我们就分别讲解几种规则的演化过程,以此更好了解红黑树的平衡操作。

1.1 左旋转

左旋定义: 把一个向右倾斜的红节点链接(2-3树,3-叉双元素节点),转化为左链接。

背景:顺序插入元素,1、2、3,2-3树保持平衡,红黑树暂时处于右倾斜。

接下来我们分别对比两种树结构的平衡操作;

  1. 2-3树,所有插入的节点都会保持在一个节点上,之后通过调整节点位置,保持平衡。
  2. 红黑树,则需要通过节点的左侧旋转,将元素2拉起来,元素1和元素3,分别成为左右子节点。

红黑树的左旋,只会处理与之对应的2-3树节点进行操作,不会整体改变。

1.2 右旋转

右旋定义: 把一个向左倾斜的红节点连接(2-3树,3-叉双元素节点),转换为右连接。

背景:顺序插入元素,3、1、1,2-3树保持平衡,红黑树暂时处于左倾斜。

接下来我们分别对比两种树结构的平衡操作;

  1. 2-3树,所有插入的节点都会保持在一个节点上,之后通过调整节点位置,保持平衡。
  2. 红黑树,则需要通过节点的右侧旋转,将元素2拉起来,元素1和元素3,分别成为左右子节点。

你会发现,左旋与右旋是相互对应的,但在2-3树中是保持不变的

1.3 左右旋综合运用

左旋、右旋,我们已经有了一个基本的概念,那么接下来我们再看一个可以综合左右旋以及对应2-3树的演化案例,如下;

以上的例子分别演示了一个元素插入的三种情况,如下;

  1. 1、3,插入0,左侧底部插入,与2-3树相比,需要右旋保持平衡
  2. 1、3,插入2,中间位置插入,首先进行左旋调整元素位置,之后进行右旋进行树平衡
  3. 1、3,插入5,右侧位置插入,此时正好保持树平衡,不需要调整
1.4 染色

在2-3树中,插入一个节点,为了保持树平衡是不插入到空位置上的,当插入节点后元素数量有3个后则需要调整中间元素向上,来保持树平衡。与之对应的红黑树则需要调整颜色,来保证红黑树的平衡规则,具体参考如下;

2. 旋转+染色运用案例

接下来我们把上面讲解到的旋转染色,运用到一个实际案例中,如下图;

  • 首先从左侧开始,是一个按照顺序插入生产出来的红黑树,插入顺序;7、2、8、1、4、3、5
  • α,向目前红黑树插入元素6,插入后右下角有三个红色节点;3、5、6
  • β,因为右下角满足染色条件,变换后;黑色节点(3、5)、红色节点(4、6)。
  • γ,之后看被红色连线链接的节点7、4、2,最小节点在中间,左旋平衡树结构。
  • δ,左旋完成后,红色链接线的7、4、2为做倾顺序节点,因此需要做右旋操作。
  • ε,左旋、右旋,调整完成后,又满足了染色操作。到此恢复红黑树平衡。

注意,所有连接红色节点的,都是是红色线。以此与2-3树做对应。

3. 删除操作

根据2-3-4树模型的红黑树,在删除的时候基本是按照2-3方式进行删除,只不过在这个过程中需要染色和旋转操作,以保持树平衡。删除过程主要可以分为如图四种情况,如下;

3.1 删除子叶红色节点

红色子叶节点的删除并不会破坏树平衡,也不影响树高,所以直接删除即可,如下;

3.2 删除左侧节点
3.2.1 被删节点兄弟为黑色&含右子节点

3.2.2 被删节点兄弟为黑色&含左子节点

3.2.3 被删节点兄弟为黑色&含双子节点(红)

3.2.4 被删节点兄弟为黑色&不含子节点

3.2.5 被删节点兄弟为黑色&含双黑节点(黑)

3.3. 删除右侧节点
3.3.1 被删节点兄弟为黑色&含左子节点

3.3.2 被删节点兄弟为黑色&含右子节点

3.3.3 被删节点兄弟为黑色&含双子节点(红)

3.2.4 被删节点兄弟为黑色&不含子节点

3.2.5 被删节点兄弟为黑色&含双黑节点(黑)

结局:总结+分享

看完美团、字节、腾讯这三家的一二三面试问题,是不是感觉问的特别多,可能咱们真的又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。

开篇有提及我可是足足背下了Java互联网工程师面试1000题,多少还是有点用的呢,换汤不换药,不管面试官怎么问你,抓住本质即可!能读到此处的都是真爱,所以福利也为你准备,这份1000题免费送你!点击这里免费领取

  • Java互联网工程师面试1000题

image.png

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的 《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。

  • 程序员代码面试指南–IT名企算法与数据结构题目最优解

image.png

  • 其余像设计模式,建议可以看看下面这4份PDF(已经整理)

image.png

  • 更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。

image.png

[外链图片转存中…(img-ztgbXskx-1626936655967)]

  • 其余像设计模式,建议可以看看下面这4份PDF(已经整理)

[外链图片转存中…(img-kFWuZ8rX-1626936655968)]

  • 更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。

[外链图片转存中…(img-9kqGhuk1-1626936655968)]

以上所提及的全部Java面试学习的PDF及笔记,如若皆是你所需要的,那么都可发送给你!

这篇关于大厂Mysql高频面试题!javabmi计算公式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/321072

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input