首页 > 数据库 >数据库——B树、B+树和B*树

数据库——B树、B+树和B*树

时间:2023-09-09 11:24:34浏览次数:35  
标签:数据库 叶子 二叉树 key 红黑树 平衡 节点

二叉查找树BST

二叉查找树,也称二叉搜索树,或二叉排序树。其定义为,要么是一颗空树,要么就是具有如下性质的二叉树:

(1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2) 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3) 任意节点的左、右子树也分别为二叉查找树;

(4) 没有键值相等的节点。

 

平衡二叉树AVL

平衡二叉搜索树,又被称为AVL树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。



平衡二叉树总结:

  • 查询时间复杂度O(logN)
  • 插入操作:左左、左右、右左、右右4种,插入操作O(1)
  • 删除操作:比较复杂,包括待删除节点是:(1)叶子节点;(2)只有左或右子树;(3)既有左子树也有右子树

平衡二叉树是一棵高度平衡的二叉树,所以查询的时间复杂度是 O(logN) 。插入的话上面也说,失衡的情况有4种,左左,左右,右左,右右,即一旦插入新节点导致失衡需要调整,最多也只要旋转2次,所以,插入复杂度是 O(1) ,但是平衡二叉树也不是完美的,也有缺点,从上面删除处理思路中也可以看到,就是删除节点时有可能因为失衡,导致需要从删除节点的父节点开始,不断的回溯到根节点,如果这棵平衡二叉树很高的话,那中间就要判断很多个节点。所以后来也出现了综合性能比其更好的树—-红黑树。

 

红黑树

红黑树可以算是树状结构中的“明星”了,应该计算机专业都听过红黑树这个专业名词,而且红黑树的应用也很广泛,比方说, java 集合中的 TreeSet 和 TreeMap ,以及 jdk8 的 HashMap 链表长度超过7之后会转成红黑树等等。但实际上红黑树却很复杂,他并不是像前面讲过的树一样是棵平衡树,即红黑树并没有定义从根节点到叶子节点的长度一致或高度差为1,然而他却能保证树大致上是平衡的—-从根到叶子的最长的可能路径不多于最短的可能路径的两倍长,这需要从他的性质中去推导出来。先来看一下红黑树的性质:

(1)节点是红色或黑色;

(2)根节点是黑色;

(3)每个叶节点(NIL节点,空节点)是黑色的;

(4)从每个叶子到根的所有路径上不能有两个连续的红色节点;

(5)从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

 

  • 红黑树特点:从根到叶子的最长的可能路径不多于最短的可能路径的两倍长

AVL树 和 红黑树对比:

AVL树是高度平衡的树(左右子树高度差为1),所以不管是插入节点也好,删除节点也好,都会很容易导致树的不平衡,从而引发调整,而红黑树不是严格的平衡树,节点插入与删除,并不容易会导致树进行调整,所以这点才是红黑树综合性能比 AVL树 好的原因。

 

————————————————
原文链接:https://blog.csdn.net/qq_25940921/article/details/82184055

 

B树(多路平衡查找树)

 

如果前面的2-3树与2-3-4树理解了,B树也就理解了,因为2-3树就是3阶的B树,2-3-4树就是4阶的B树。所以,对于B树的性质,根据2-3-4树都可以推导出来了,即,

  一颗m阶的B树(B-tree) 定义如下:

(1)每个节点最多有 m-1 个key;

(2)根节点至少有1个key;

(3)非根节点至少有 Math.ceil(m/2)-1 个key;

(4)每个节点中的key都按照从小到大的顺序排列,每个key的左子树中的所有key都小于它,而右子树中的所有key都大于它;

(5)所有叶子节点都位于同一层,即根节点到每个叶子节点的长度都相同。

  如下图是一棵4阶B树(2-3-4树)

 

 

B+树

B+树在B树的基础上做了优化,它与B树的差异在于:

(1)有 k 个子节点的节点必然有 k 个key;

(2)非叶子节点仅具有索引作用,跟记录有关的信息均存放在叶子节点中。

(3)树的所有叶子节点构成一个有序链表,可以按照key排序的次序遍历全部记录。

B树 对比 B+树

  • B+树的优点在于:
    • 1.由于B+树在内部节点上不包含数据信息,因此在内存页中能够存放更多的key。数据存放的更加紧密,具有更好的空间局部性。因此访问叶子节点上关联的数据也具有更好的缓存命中率。
    • 2.B+树的叶子结点都是相链的,因此对整棵树的便利只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历,相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。
  • B树也有优点,其优点在于:
    • 由于B树的每一个节点都包含key和value,因此经常访问的元素可能离根节点更近,因此访问也更迅速。

 

B*树

在B+ 树非根和非叶子结点再增加指向兄弟的指针

  • B-树适用场景:

    • 文件系统:B-树通常用于文件系统的索引结构,因为它可以更好地处理磁盘上的随机读写操作。
    • 数据库管理系统:在某些情况下,B-树可以用于数据库管理系统中的索引,特别是在存储引擎需要支持随机访问的情况下。
  • B+树适用场景:

    • 数据库索引:B+树是最常见的数据库索引结构,适用于数据库系统中的绝大多数情况。它在范围查询、按顺序遍历和插入/删除操作方面表现出色。
    • 文件系统:虽然B-树也用于文件系统,但B+树同样适用,尤其在需要支持大文件的情况下。
  • B*树适用场景:

    • 高度平衡要求:B*树通常用于需要维护高度平衡的场景,以减少树的高度。这在某些存储引擎中可能会有所帮助。
    • 高度不断增长的情况:如果数据集的大小在不断增长,而且需要保持树的平衡性,B*树可能比传统的B-树更适合。

 

标签:数据库,叶子,二叉树,key,红黑树,平衡,节点
From: https://www.cnblogs.com/daxiawan2022/p/17689024.html

相关文章

  • 15.mysql数据库安全性
    MySQL数据库的安全性是一个复杂而广泛的主题,它涉及多个方面,包括访问控制、数据保护、身份验证、审计和防止常见的数据库攻击等。以下是一些常见的MySQL数据库安全性最佳实践和示例代码,以帮助您加强MySQL数据库的安全性。请注意,这只是一个起点,实际的安全措施可能因应用程序和......
  • 十年后数据库还是不敢拥抱NUMA?
    十年后数据库还是不敢拥抱NUMA?在2010年前后MySQL、PG、Oracle数据库在使用NUMA的时候碰到了性能问题,流传最广的这篇 MySQL–TheMySQL“swapinsanity”problemandtheeffectsoftheNUMAarchitecture 描述了性能问题的原因(文章中把原因找错了)以及解决方案:关闭NUMA。......
  • 十年后数据库还是不敢拥抱NUMA?
    十年后数据库还是不敢拥抱NUMA?在2010年前后MySQL、PG、Oracle数据库在使用NUMA的时候碰到了性能问题,流传最广的这篇 MySQL–TheMySQL“swapinsanity”problemandtheeffectsoftheNUMAarchitecture 描述了性能问题的原因(文章中把原因找错了)以及解决方案:关闭NUMA。......
  • 权限提升-MY&MS&ORA等SQL数据库提权
    Web提权本地提权皆可,核心是得到数据库的账号密码在利用系统溢出漏洞无果的情况下,可以采用数据库进行提权数据库提权的前提条件:服务器开启数据库服务及获取到最高权限用户密码除Access数据库外,其他数据库基本都存在数据库提权的可能流程:服务探针-信息收集-提权利用-获取......
  • Alembic:Python数据库迁移工具
    Alembic是一款轻量型的数据库迁移工具,它与SQLAlchemy一起共同为Python提供数据库管理与迁移支持。Alembic的应用Alembic使用SQLAlchemy作为数据库引擎,为关系型数据提供创建、管理、更改和调用的管理脚本,协助开发和运维人员在系统上线后对数据库进行在线管理。同任何P......
  • Oracle数据库添加索引注意事项
    1、确定是否有专门的索引空间。--查看表所在的表空间SELECT*FROMuser_tablestWHEREt.table_name='TABLENAME';--查看索引所在的索引空间SELECTTABLESPACE_NAMEFROMDBA_INDEXESWHEREINDEX_NAME='INDEXNAME';2、预估建立索引所需的空间大小。3、查看表空间剩余或者索......
  • XP系统无法访问Mysql 8.0.32数据库的问题
    之前一个项目,客户那边突然反应软件的数据库都访问不了了。这之前他们升级过MYSQL数据库的版本,更新到了最新的版本。我们的应用,因为需要兼容XP系统,所以当时用的是.NETFramework4.0。MySQL的驱动库在6.9.12之后就不支持.NET4.0了。所以我们用的MySQL库是6.9.12的,这个版本的库......
  • CentOS安装Oceanbase数据库
    概述    项目中需要用到国产免费数据库,高斯数据库安装、使用比较麻烦,本次实验安装海钡云数据库。下载链接:https://www.oceanbase.com/softwarecenter版本:V4.2.0_CE_BETA_HF1硬件要求:安装将oceanbase-all-in-one-4.2.0.0-100120230821114201.el7.x86_64.tar.gz文件放入/home......
  • 达蒙数据库使用
    镜像下载链接docker run -d --name dm8_01 \--privileged=true \-p 5236:5236 \-e PAGE_SIZE=16 \-e LD_LIBRARY_PATH=/opt/dmdbms/bin \-e INSTANCE_NAME=dm8_01 \-m 2048m \-v $(pwd)/opt_dmdbms_data:/opt/dmdbms/data \dm8_single:dm8_20230808_r......
  • oracle导出导入数据库
    先捋一下oracle的概念oracle的概念稍微有点复杂:用户账号和表空间绑定,表空间分为永久表空间和临时表空间,通过表空间设置数据库的大小等参数,在表空间里面进行新建数据表等操作,oracle的表空间等同于mysql的数据库tnsname里面的server是oracle服务端的连接配置,是用来连接数据库的......