首页 > 其他分享 >BTree与B+Tree图文详解--转

BTree与B+Tree图文详解--转

时间:2022-12-30 15:00:59浏览次数:70  
标签:-- Tree 关键字 查找 二叉树 磁盘 BTree 节点

简介: B树与B+树区别

一、前言

磁盘I/O:是指磁盘的输入和输出(Input和Output的缩写)。

二叉查找树:左子树的键值小于根的键值,右子树的键值大于根的键值。

6220c299e93da24732b86e4365a09435.png

二叉查找树可以任意地构造,同样是2,3,5,6,7,8这六个数字,也可以按照下图的方式来构造:

976d81446367750a7eb46c5557f45f2a.png

由图1和图2来查找数字8,深度很明显有差距,所以其查找的时间复杂度O(log2N)与树的深度相关,那么降低树的深度自然会提高查找效率。 因此若想二叉树的查询效率尽可能高,需要这棵二叉树是平衡的,从而引出新的定义——平衡二叉树,或称AVL树

平衡二叉树 :

平衡二叉树(AVL树)在符合二叉查找树的条件下,还满足任何节点的两个子树的高度最大差为1。下面的两张图片,左边是AVL树,它的任何节点的两个子树的高度差<=1;右边的不是AVL树,其根节点的左子树高度为3,而右子树高度为1。

34b74a4af6875e0b8baa99f5e2412d97.png

但是平衡二叉树在删除或者新增节点时可能会失去平衡

二叉查找树结构会因树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下

二、平衡多路查找树(B-Tree)

B-Tree是为磁盘等外存储设备设计的一种平衡查找树,系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么

B-Tree结构的数据可以让系统高效的找到数据所在的磁盘块。为了描述B-Tree,首先定义一条记录为一个二元组[key, data] ,key为记录的键值,对应表中的主键值,data为一行记录中除主键外的数据。对于不同的记录,key值互不相同。

一棵m阶的B-Tree有如下特性:

  • 每个节点最多有m个孩子。
  • 除了根节点和叶子节点外,其它每个节点至少有Ceil(m/2)个孩子。
  • 若根节点不是叶子节点,则至少有2个孩子
  • 所有叶子节点都在同一层,且不包含其它关键字信息
  • 每个非终端节点包含n个关键字信息(P0,P1,…Pn, k1,…kn)
  • 关键字的个数n满足:ceil(m/2)-1 <= n <= m-1
  • ki(i=1,…n)为关键字,且关键字升序排序。
  • Pi(i=1,…n)为指向子树根节点的指针。P(i-1)指向的子树的所有节点关键字均小于ki,但都大于k(i-1)

它的每一个节点最多包含m个孩子,m便称为B树的阶。m的大小取决于磁盘页的大小。

3de6e741b226c431a5d30b7a205c0a03.png

B树的出现是为了弥合不同的存储级别之间的访问速度上的巨大差异,实现高效的 I/O。平衡二叉树的查找效率是非常高的,并可以通过降低树的深度来提高查找的效率。但是当数据量非常大,树的存储的元素数量是有限的,这样会导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下。另外数据量过大会导致内存空间不够容纳平衡二叉树所有结点的情况。B树是解决这个问题的很好的结构。

三、B+Tree

B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构。

B+Tree相对于B-Tree有几点不同:

  1. 非叶子节点只存储键值信息。
  2. 所有叶子节点之间都有一个链指针。
  3. 数据记录都存放在叶子节点中。

1879be81ff7beed95f8fc8ef4f71ea1e.png

通常在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。因此可以对B+Tree进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。

为什么说B+树比B树更适合数据库索引?

1)B+树的磁盘读写代价更低

B+树的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了;

2)B+树查询效率更加稳定

由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当;

3)B+树便于范围查询(最重要的原因,范围查找是数据库的常态)

B树在提高了IO性能的同时并没有解决元素遍历的我效率低下的问题,正是为了解决这个问题,B+树应用而生。B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低。

转至https://developer.aliyun.com/article/983989

标签:--,Tree,关键字,查找,二叉树,磁盘,BTree,节点
From: https://www.cnblogs.com/hsjz-xinyuan/p/17014884.html

相关文章

  • 北京君正:高端的CPU+NPU异构处理器
    北京君正亮相2021ELEXCON深圳国际电子展,国内知名的云FAE在线技术服务平台创易栈受邀参观了北京君正所在的3K30号展厅,并全程进行了线上直播。在展厅内,北京君正对公司芯......
  • java 多线程并行执行任务 demo
    packagecom.sleep.demo;importorg.apache.commons.lang3.StringUtils;importjava.util.*;importjava.util.concurrent.*;importjava.util.concurrent.atomic.A......
  • 全网最牛逼的 Elasticsearch 天团博客集合
    Elasticsearch最少必要知识实战教程直播回放1、事出有因一个问题引发的国内外最牛逼的elasticsearch天团博客集合。兄弟们 有玩过这个API的吗?这个suggest是干嘛作......
  • mysql 修改密码
    1.使用mysqladmin修改密码使用mysqladmin命令修改MySQL的root用户密码格式为:mysqladmin-u用户名-p旧密码password新密码例如(root用户,root密码,修改密码为1234):......
  • 关于RxJava2.0你不知道的事
    前言如果你对RxJava1.x还不是了解,可以参考下面文章。​​1.RxJava使用介绍​​【视频教程】2.RxJava操作符  ​​•CreatingObservables(Observable的创建操作符)......
  • too many open files
    查看进程文件句柄设置cat/proc/<pid>/limits找到openfiles这一项,查看设置值是否过小修改值大小:在/etc/secutiry/limits.conf末尾添加:roothardnofile655360root......
  • RxJava 合并组合两个(或多个)Observable数据源
    关键词:合并ObservableRxJava系列教程:​​1.RxJava使用介绍​​​​【视频教程】​​​​2.RxJava操作符  ​​•CreatingObservables(Observable的创建操作符)​......
  • AI | 强化学习 | Sarsa
    AI|强化学习|Sarsa首先感谢莫烦大佬的公开教程。https://github.com/MorvanZhou/Reinforcement-learning-with-tensorflowsarsa是强化学习中的一种,属于在线学习。【......
  • Ynoi2019模拟赛题解
    \(Ynoi2019\)模拟赛题解前言:第一次做\(Ynoi\)还是有被离谱到的,我从来没有做到过这么卡常的题目,我到现在\(T1\)都还是\(70\)分,\(lxl\)毒瘤名不虚传啊。但是不得不说,\(Ynoi......
  • Spring MVC的web.xml配置详解
    SpringMVC是创建javaweb项目时比较常用的框架,其中web.xml配置文件是更不可少的,那么首先先了解javaweb中的web.xml文件。一、认识web.xml文件1、web.xml的作用首先java......