首页 > 其他分享 >B,B+, 红黑树

B,B+, 红黑树

时间:2023-10-17 10:33:24浏览次数:17  
标签:写入 查询 哈希 红黑树 数据 节点

B, B+, 红黑树记录

都是用于加快查找的平衡树,应用场合和性质有所不同,需要理解使用他们的原因,以及他们各种奇怪的自平衡的方式。

B树

B,B+树主要用于数据库、文件系统索引。具体如何是实现?

主要长这样,一个节点存储的有多个数据和子节点索引。

image-20231017090536051

b树对于每个节点中的数据和子节点索引的数量有如下限制

假设该B树为t阶,也就是每个节点中子节点数量最大值为tt取决于磁盘块大小,因为读取磁盘的时候是一块一块读取的,所以一次IO读取一个b树节点,该节点最大限制就是磁盘块的限制。

  • 根节点至少两个子节点
  • 每个中间节点都包含k-1个数据和k个子节点,其中 m/2 <= k <= m
  • 每个叶子节点都包含k-1个数据,其中 m/2 <= k <= m
  • (以上两个 m / 2 都是向上取整)

插入和删除操作也都是围绕这个规则进行。

  • 如果插入某个数据后该节点的数据或者子节点数量超出限制,则将该节点中间值提出来作为父节点放到上一层,剩下的部分分成两半。当然,如果上一层依然满了,继续向上,最后如果直到根节点还要往上,那B树就会增加一层。
  • 如果删除数据后,某个节点相关的数量低于限制,则会查看左右兄弟节点数据是否足够(大于最低限制),足够的话将父节点中的一个元素转移到当前节点,再把兄弟节点的最小(或者最大,取决于在左兄弟还是右兄弟)上升到父节点下移数据的位置。如果左右兄弟都不够,可以先下移父节点的数据,然后和兄弟合并。具体的可以看这个文章ref

优缺点

优点

  • 一个节点能存储更多数据和节点信息,树的高度下降,查询次数降低,降低IO次数

缺点

  • 维护复杂,在内存中查询的速度不如红黑树和哈希
  • 不适合范围查询,因为范围连续的数据可能在B树的不同层级,需要中序遍历(因为中序遍历是有序的序列)。范围、遍历不如B+树

关键就在于B树经常用于装不进内存中的数据查询,比如数据库,因为数据量太大,无法把整个数据放进内存,所以不适合用哈希和红黑树,更适合使用B树,一次可以只加载一个节点进入内存进行查询。他一个节点存储的数据比哈希和红黑树多很多,所以降低高度,减少IO次数。

B+树

B+树在B树的基础上,每个非叶子节点只存子节点索引和关键字,不存数据。叶子节点之间相连成链表。

长这样。

image-20231017095555822

优点

  • 查询效率稳定,因为数据都在叶子节点。
  • 范围查询高效,因为是在链表上范围查询。
  • 适合读取。

缺点

  • 不适合随机写入,因为B+树需要频繁分裂合并,造成效率下降(B树也是)

一些解决方式,(GPT)

对于数据库中频繁的随机写入操作,传统的B+树可能不是最佳选择,因为它需要频繁地进行分裂和合并操作,从而降低性能。以下是一些适合处理频繁随机写入的数据结构或技术:

  1. 哈希表: 哈希表适用于快速随机访问,因为它可以直接计算数据的哈希值并将数据插入或查找。然而,哈希表通常不支持范围查询。
  2. LSM树(Log-Structured Merge Tree): LSM树是一种特殊的数据结构,优化了随机写入操作。它将写入操作追加到一个新的磁盘文件,然后定期将这些文件进行合并,从而减少随机写入的开销。LSM树广泛用于分布式数据库系统,如HBase和Cassandra。
  3. B树的变种: 在某些情况下,可以使用B树的变种来处理频繁的随机写入。例如,B树的变种B*-Tree和Fractal Tree可以更好地处理高并发写入操作,但它们仍然需要权衡查询性能。
  4. 内存数据库: 如果数据可以完全存储在内存中,并且随机写入是主要操作,那么内存数据库可能是一个更好的选择,因为内存中的数据结构通常对随机写入操作更加友好。
  5. 分区和分片: 将数据库表分成多个分区或分片,每个分区/分片独立管理,可以减轻随机写入操作对整个数据库的影响。

红黑树

红黑树也是一种平衡二叉树,“类”是因为他没有定死的平衡因子,比如AVL平衡因子是1,即要求左右子树高度差不能超过1.

红黑树有五条节点限制,这些限制的结果就是左右子树最高不会超过最短的两倍。

此文详细介绍了五条规则和调整细节ref

和AVL相比,有什么不同

  • 因为高度限制比较宽松,所以同样数据最大高度更高
  • 因为限制宽松所以红黑树用于调整的时间更短,当然,增删查都是log n
    • 红黑树:其中添加、删除都仅需 O(1) 次旋转调整
    • AVL树:其中添加仅需 O(1) 次旋转调整、删除最多需要 O(logn) 次旋转调整

如何选择

如果查询比较多,用AVL,如果增删查都差不多,用红黑树。

实际中红黑树用的更多。比如java中TreeMap, TreeSet

标签:写入,查询,哈希,红黑树,数据,节点
From: https://www.cnblogs.com/BayMax0-0/p/17769117.html

相关文章

  • HashMap-红黑树
       ......
  • MySQL专题面试题-二叉树、红黑树、B 树、B+树
    演示网址:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html所谓的索引,就是帮助MySQL高效获取数据的排好序的数据结构,基本都是按照k-v形式存储。1.二叉树 二叉树的每个节点至多只有2个叶子节点,且左边的叶子节点键值比根节点小,右边的叶子节点键值比根节点大。这......
  • 【Java 基础篇】Java TreeSet 详解:红黑树实现的有序集合
    Java集合框架提供了多种数据结构,用于存储和操作数据。其中,TreeSet是一种特殊类型的集合,它通过红黑树(Red-BlackTree)数据结构实现了有序的、唯一元素存储。本篇博客将深入探讨TreeSet,包括其概念、特性、内部实现、使用方法以及示例代码。无论您是初学者还是有一定经验的Java开......
  • 红黑树简明教程
    前言红黑树是一种性能非常优秀的有序数据结构,一般用于在内存中实现有序列表/集合/字典/优先队列等,在各大语言的标准函数库,操作系统中的任务调度、定时器等场景下有着广泛的应用。然而,红黑树也是一种以复杂闻名的数据结构,实现时需要考虑的情况非常之多,以至于“手撕红黑树”......
  • 关联式数据结构_红黑树剖析 #C++
    红黑树的性质和定义红黑树的性质红黑树是一种平衡搜索二叉树。红黑树的每个节点存储了一个标记颜色的变量(红色或黑色),通过对任意一条从根到叶子结点的路径中节点着色方式的限制,使树的最长路径不超过最短路径的两倍,因而红黑树处于一种近似平衡的状态。与AVL树相比,红黑的平衡条件更......
  • STL(12) RBTREE 红黑树
    目录红黑树的基本原理基本要求变色和旋转rbtree源码G2.9示例2.94.9treenode的构造关联式容器:查找快,插入快STL中的主要代表:红黑树,hashtable红黑树的基本原理单个结点来看,左孩子小于根节点,右孩子大于根节点(二叉搜索树)红黑树是什么,有什么意义:排序二叉树有不平衡的问题,可能左......
  • MySQL索引详解(Hash、AVL、红黑树、B、B+)
    MySQL索引详解|JavaGuide(Java面试+学习指南)索引介绍索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。索引的作用就相当于书的目录。打个比方:我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。......
  • 红黑树的知识点以及源码
    花了几个小时看了B站大佬刘冬煜讲解红黑树源码和性质,对红黑树知识有了一个很清晰的理解。满满的成就感,把大佬有关红黑树的资料借用了一下,做了一点简单的修改。红黑树具有如下的性质:1.红黑树是一颗平衡二叉搜索树,其中序遍历单调不减。2.节点是红色或者黑色。3.根节点是黑色。......
  • 红黑树
    1.AVLtree平衡二叉查找树适合于插入删除少查找多的情况2.二叉搜索树条件:1.非空左子树的所有键值小于其根节点键值2.非空右子树所有键值小于根节点键值3.左右子树都是二叉搜索树3.红黑树二叉查找树,每个节点上增加一个存储位表示节点颜色,Red或Black。通过对任何一条从......
  • 红黑树(一)
    红黑树AVLTree:要求左右高度差不超过1;---严格平衡红黑树:最长路径不超过最短路径的2倍。-----不严格---近似平衡-----达到的效果:相对而言,插入同样的数据,AVL树旋转更多,红黑树旋转更少。AVL树查找时更快,红黑树查找时比AVL慢。第3点解读一下就是:树中没有连续的红色结点。红......