首页 > 编程语言 >Java基础:B树、B+树和红黑树的数据结构,三者区别

Java基础:B树、B+树和红黑树的数据结构,三者区别

时间:2024-06-16 22:29:03浏览次数:36  
标签:黑树 Java log 复杂度 叶子 键值 红黑树 树和红 节点

B树(B-Tree)

数据结构
  • 节点结构:每个节点包含多个键值和子节点指针。
  • 阶(Degree):B树的阶定义了每个节点的最小和最大键值数。对于阶为 ( m ) 的B树:
    • 每个节点最多有 ( m-1 ) 个键值和 ( m ) 个子节点。
    • 每个节点(除了根节点)至少有 ( \lceil m/2 \rceil - 1 ) 个键值和 ( \lceil m/2 \rceil ) 个子节点。
    • 根节点至少有一个键值。
  • 平衡性:所有叶子节点在同一层,保证了树的平衡性。
操作
  • 查找:从根节点开始,逐层向下查找,时间复杂度为 ( O(\log n) )。
  • 插入:找到合适的叶子节点插入,如果节点满了则进行分裂,时间复杂度为 ( O(\log n) )。
  • 删除:从叶子节点删除,如果节点的键值数小于最小值则进行合并或借用操作,时间复杂度为 ( O(\log n) )。

B+树(B+Tree)

数据结构
  • 节点结构:和B树类似,但有显著区别:
    • 内部节点只包含索引,不存储实际数据。
    • 叶子节点包含所有数据,并通过链表相连。
  • 阶(Degree):B+树的阶定义了每个节点的最小和最大索引数。对于阶为 ( m ) 的B+树:
    • 每个内部节点最多有 ( m ) 个子节点。
    • 每个节点(除了根节点)至少有 ( \lceil m/2 \rceil ) 个索引和子节点。
    • 所有叶子节点在同一层,形成一个链表。
操作
  • 查找:从根节点开始,逐层向下查找,最后在叶子节点找到数据,时间复杂度为 ( O(\log n) )。
  • 插入:找到合适的叶子节点插入,如果叶子节点满了则进行分裂,时间复杂度为 ( O(\log n) )。
  • 删除:从叶子节点删除,如果节点的索引数小于最小值则进行合并或借用操作,时间复杂度为 ( O(\log n) )。

红黑树(Red-Black Tree)

数据结构
  • 节点结构:每个节点包含键值、颜色(红色或黑色)、左右子节点指针和父节点指针。
  • 平衡规则
    • 每个节点是红色或黑色。
    • 根节点是黑色。
    • 红色节点的子节点必须是黑色(即红色节点不能有红色子节点)。
    • 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
操作
  • 查找:从根节点开始,逐层向下查找,时间复杂度为 ( O(\log n) )。
  • 插入:按照二叉搜索树插入后,通过旋转和重新着色保持平衡,时间复杂度为 ( O(\log n) )。
  • 删除:按照二叉搜索树删除后,通过旋转和重新着色保持平衡,时间复杂度为 ( O(\log n) )。

对比三者的区别

  1. 节点结构

    • B树:每个节点包含多个键值和子节点指针。
    • B+树:内部节点只包含索引,叶子节点包含所有数据并形成链表。
    • 红黑树:每个节点包含一个键值和颜色属性,左右子节点指针和父节点指针。
  2. 平衡性

    • B树B+树:通过节点分裂和合并保持平衡。
    • 红黑树:通过旋转和重新着色保持平衡。
  3. 查询效率

    • B树B+树:适用于大数据量的磁盘存储和范围查询,时间复杂度为 ( O(\log n) )。
    • 红黑树:适用于内存中的快速查找、插入和删除操作,时间复杂度为 ( O(\log n) )。
  4. 存储位置

    • B树:数据分布在所有节点。
    • B+树:数据只存储在叶子节点,内部节点只存储索引。
    • 红黑树:数据存储在每个节点。
  5. 适用场景

    • B树B+树:适用于数据库和文件系统等需要大量磁盘I/O操作的场景。
    • 红黑树:适用于内存中频繁插入、删除、查找操作的场景,如实现关联容器(如C++ STL中的mapset)和Java中的TreeMapTreeSet

总结

B树和B+树适用于磁盘存储,因为它们减少了磁盘I/O次数。红黑树适用于内存中的动态数据结构操作。B+树特别适合范围查询和顺序访问,而红黑树则在保持平衡的同时提供了高效的插入和删除操作。

标签:黑树,Java,log,复杂度,叶子,键值,红黑树,树和红,节点
From: https://blog.csdn.net/qq_42631788/article/details/139727644

相关文章

  • 【JavaWeb】SpringBootWeb请求响应
    前言在上一次,我们开发了springbootweb的入门程序。基于SpringBoot的方式开发一个web应用,浏览器发起请求/hello后,给浏览器返回字符串“HelloWorld~”。其实呢,是我们在浏览器发起请求,请求了我们的后端web服务器(也就是内置的Tomcat)。而我们在开发web程序时呢,定义了一个控......
  • 自学编程Java入门基础教学
    (首先下载typora/15天免费使用)MARKDOWN标题(符号必须英文输入法)标题#(#个数分级别)空格文案二级标题三级标题文字world!(前后两个*加粗)world!(1斜体*)world!(3*斜体加粗)world!(两个~波浪号删除线)引用吗喽小帆船自学Java寻大厂offer(>空格)分割线(三个-获三个*分割线)......
  • [Java]讲解@CallerSensitive注解
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18251310出自【进步*于辰的博客】参考笔记三,P53.1。目录1、介绍2、三种VMOptions最后1、介绍大家可能没注意过此注解,我从JDK源码中摘取一段:@CallerSensitivepublic......
  • 安卓应用开发——Android Studio中This project contains Java compilation errors, w
    这个提示信息表明你的Java项目中存在编译错误,这些错误可能会导致自定义视图(customviews)的渲染失败。要解决这个问题,你需要先修复这些编译问题。以下是一些步骤,你可以按照这些步骤来查找并修复Java编译错误:查看编译错误:在你的集成开发环境(IDE)中,通常会有一个编译错误或警......
  • JAVA开发 选择多个文件,系统运行后自动生成ZIP压缩包
    选择多个文件,系统运行后自动生成ZIP压缩包实现方法1.1代码块1.2运行结果截取相关知识实现方法案例简述:通过启动java代码来打开文件选择器对话框,用户选择确认需要进行压缩的文件,可一次性选择多个文件,选择完毕后点击按钮确认,指定位置自动生成压缩包。1.1代码块i......
  • Java编程:动态规划
    背包问题:有一个背包,容量为4磅,现有如下物品要求达到的目标为装入的背包的总价值最大,并且重量不超出要求装入的物品不能重复动态规划算法介绍===================================================================动态规划(DynamicProgramming)算法的核心思想是......
  • 2024年Java后端开发学习路线(建议收藏!)
    第二部分:Java高级在Java高级中,我们应该要熟练掌握。Java多线程/高并发,数据结构和算法,设计模式和JVM。第三部分:JavaWEB学习JavaWeb也就算正式开始了Java项目的开发,在这个阶段需要掌握Tomcat服务器的搭建,数据的传输。第四部分:主流框架和项目管理在这个阶段,我们需要......
  • java学习03
    类型转换强制类型转换自动类型转化自动类型转换会从低到高转换类型转换注意点1、不能进行布尔类型的转换2、转化时会有精度和溢出的问题变量java变量类型名称值typevarName[=value]局部变量在方法里面实例变量在方法外在类里面类变量带static时可直接在方法里使......
  • 【JavaScript脚本宇宙】提升Markdown工作流:不可错过的六个JavaScript库
    优化你的Markdown体验:六大JavaScript库一网打尽前言在现代Web开发中,Markdown作为一种轻量级的标记语言,凭借其简洁易读的语法和广泛的适用性,迅速成为开发者们的宠儿。为了更有效地解析和处理Markdown内容,JavaScript社区涌现了许多功能强大的库。这些库不仅能够高效地将Mark......
  • 【JavaEE精炼宝库】多线程(6)线程池
    目录一、线程池的概念及优势1.1线程池的概念:1.2线程池的优势:二、工厂模式三、标准库中的线程池3.1标准库线程池参数解释:3.1.1corePoolSize|maximumPoolSize:3.1.2keepAliveTime|unit:3.1.3workQueue: 3.1.4ThreadFactory: 3.1.5handler:3.2创建线程池演......