首页 > 其他分享 >平衡二叉树、B树、B+树、红黑树解析

平衡二叉树、B树、B+树、红黑树解析

时间:2024-08-21 11:51:22浏览次数:14  
标签:value 二叉树 key 红黑树 logn 解析 节点

目录

有序二叉树

  • 关于有序二叉树的详解以及 J a v a Java Java代码实现详见:二叉排序树详解并通过Java代码实现。
  • 每个节点最多有两个孩子节点。
  • 任一节点的值大于其左孩子的值,小于其右孩子的值。
  • 有序二叉树在查找和排序方面具有比较好的性能。
  • 有序二叉树性能不稳定,查找的复杂度介于 O ( l o g n ) − O ( n ) O(logn) - O(n) O(logn)−O(n) 之间。

平衡二叉树

  • 对于构造有序二叉树时出现的一些特殊的情况,例如每个节点的值都比上一个插入的值要大,那么构造出来的二叉树就会像一个链表一样向一边不断延伸。这种情况下我们对数据进行查找的复杂度就又会变成 O ( n ) O(n) O(n)。
  • 为了使有序二叉树稳定,我们引入平衡二叉树,平衡二叉树在有序二叉树的基础之上,左右子树的高度差不会超过 1 1 1。这样就确保了在进行数据查找是接近 O ( l o g n ) O(logn) O(logn) 的复杂度。
  • 数据在插入的过程中是无序的,为了解决这一问题,我们引入了四种算法:RRLLRLLR。通过节点的旋转来使二叉树平衡。

构造平衡二叉树

RR

RR

LL

LL

RL

RL

LR

LR

平衡二叉树的优缺点:

  • 优点:左右孩子节点平衡,查找消耗的时间复杂度无限接近 O ( l o g n ) O(logn) O(logn)。
  • 缺点:过于复杂,构建过程会消耗计算机的性能。

2-3-4树

  • 2-3-4树中存在着3种类型的节点:
节点名称特征
2节点存放一个数据,分出两个叉
3节点存放两个数据,分出三个叉
4节点存放三个数据,分出四个叉
  • 2-3-4树的构造过程中,优先生成小节点,节点值多了存不下,就把中间的往上面挤,如果中间存放了两个数据,就把靠后的那个数据往上挤生成一个新的节点。

2-3-4树

红黑树

  • 红黑树由2-3-4 树转换而来,2节点转化为黑色节点,3节点转化为一个黑色节点下挂一个红色节点,4节点转化为一个黑色节点下挂两个红色节点。

红黑树

  • 红黑树的特点:
  1. 每个节点不是红色就是黑色。
  2. 根节点一定是黑色。
  3. 如果一个节点是红色,那个它的子节点一定是黑色。
  4. 从根节点到任意叶子节点上黑色节点数目是相同的。
  5. 最长路径(红黑交替)最多是最短路径(全黑)的两倍。
  • 因此红黑树的性能介于排序二叉树和平衡二叉树之间,时间复杂度是可以接受的。

B树

  • 几阶B树就表示每个节点分出几个叉。例如: M M M阶B树最多分出 M M M个叉,每个节点最多存放 M − 1 M-1 M−1个数据。
节点名称特征
2节点存放一个 k e y key key和 v a l u e value value,分出两个叉
3节点存放两个 k e y key key和 v a l u e value value,分出三个叉
4节点存放三个 k e y key key和 v a l u e value value,分出四个叉
5节点存放四个 k e y key key和 v a l u e value value,分出五个叉
  • 五阶B树构建示意图:
    B树

B+树

  • B+树的非叶子节点仅具有索引作用,也就是说,非叶子节点只能存放 k e y key key 值,不存放 v a l u e value value 值,所有的 v a l u e value value 值都在叶子节点。
  • 这样的存储方式能确保一页存储更多的数据,整个树的高度会更低。
  • B+树的叶子节点构成一个有序链表,因此对整棵树的遍历只需要遍历叶子节点即可。
  • 四阶B+树构建示意图:
    B+树

B树、B+树、红黑树的应用

应用备注
B树磁盘中的数据存储因为磁盘文件较多,如果用红黑树是二叉树,会导致树高度偏高,查找性能会比较差。
红黑树应用于内存的数据存储红黑树的查找性能接近于 O ( l o g n ) O(logn) O(logn),内存中的文件并不多,但对性能的要求较高。
B+树一般用于数据库中数据存储因为叶子节点之间有连接,方便进行范围查找。( k e y key key 值表示主键, v a l u e value value 值表示存储数据的地址)

标签:value,二叉树,key,红黑树,logn,解析,节点
From: https://blog.csdn.net/dawn191228/article/details/141222186

相关文章

  • Android开发 - BluetoothClient 类处理蓝牙全过程连接与数据解析
    BluetoothClient是什么BluetoothClient类通常用于蓝牙应用中,特别是与蓝牙设备进行通信的客户端管理。通常用于在Android应用中进行蓝牙通信。它帮助你处理与蓝牙连接、设备发现、数据传输等等任务BluetoothClient的使用环境连接到蓝牙设备:通过BluetoothClient,你可以......
  • Android开发 - Handler 类处理线程通信与任务调度解析
    什么是Handler类是处理线程间通信和任务调度的一个重要工具,用于在不同的线程之间传递消息和执行任务使用场景线程间通信:在子线程中执行任务后,更新主线程(UI线程)的界面。任务调度:安排在将来某个时间点执行的任务。基本工作原理消息队列:每个线程(包括主线程)都有一个......
  • 扫雷基础与进阶(全面解析)
    前言:对于基础版扫雷,你需要掌握的知识有:循环与分支、函数基础、二维数组以及随机数函数(不懂可以看看我这篇文章《随机数函数和猜数字游戏》,需要了解rand,srand,time这三个函数);对于进阶版扫雷,你还得了解函数递归调用的思想。注意:如果想不看解析只看代码,可以直接阅读“省略......
  • leetcode 热题思路解析-最长连续序列
    题目给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。示例2:输入......
  • Windows 隐蔽 DNS 隧道是一种利用 DNS 协议在网络上进行隐蔽数据传输的技术。DNS(域名
    Windows隐蔽DNS隧道是一种利用DNS协议在网络上进行隐蔽数据传输的技术。DNS(域名系统)通常用于将域名解析为IP地址,但其协议本身并不限制传输的数据内容。因此,攻击者或信息安全专家可能利用这一点,通过DNS请求和响应传输未经授权的数据流量。工作原理数据编码:首先,将要传......
  • ViT 原理解析 (Transformers for Image Recognition at Scale)
    ViT原理解析(TransformersforImageRecognitionatScale)原创 小白 小白研究室 2024年06月10日21:09 北京如何将transformer应用到图像领域Transformer模型最开始是用于自然语言处理(NLP)领域的,NLP主要处理的是文本、句子、段落等,即序列数据。视觉领域处理的......
  • Android开发 - BleConnectOptions 类设置蓝牙连接选项解析
    BleConnectOptions是什么BleConnectOptions类是与蓝牙设备连接相关的一个配置类。它主要用于设置蓝牙连接的选项,确保与蓝牙设备的连接能够根据需求进行调整和优化。常用于配置蓝牙设备的连接参数,例如连接超时时间、是否自动连接等。这些配置可以帮助你更好地控制蓝牙连接过程,......
  • OFtutorial10_transportEquation解析
    组成OFtutorial10.C源码头文件#include"fvCFD.H"主函数intmain(intargc,char*argv[]){头文件 //Setupthecase,parsecommandlineoptionsandcreatethegrid#include"setRootCase.H"#include"createTime.H"#inclu......
  • OFtutorial09_runtimePostprocessingUtility解析
    组成pipeCalc.H源码头文件#ifndefpipeCalc_H#definepipeCalc_H#include"volFieldsFwd.H"#include"Switch.H"#include"fvc.H"#include"fvMeshFunctionObject.H"#include"logFiles.H"#include"addToRunTi......
  • 汇编语言的神秘面纱:指令前缀的深度解析
    标题:汇编语言的神秘面纱:指令前缀的深度解析在计算机编程的底层世界中,汇编语言以其接近硬件的特性,扮演着至关重要的角色。指令前缀是汇编语言中一个关键的概念,它为指令提供了额外的信息,使得程序能够执行更加复杂和灵活的操作。本文将深入探讨指令前缀的作用、类型以及如何在......