多路查找树

二叉树和B树

二叉树的问题分析
  • 二叉树操作效率高

  • 二叉树需要加载到内存,若二叉树的节点多存在如下问题:

    1. 问题1:构建二叉树时,需多次进行I/O操作,对与速度有影响

    2. 问题2:节点海量造成二叉树的高度很大,会降低操作速度

多叉树
  1. 在二叉树中,每个节点有数据项,最多有两个子节点。如果允许每个节点可以有更多的数据线和更多的子节点,就是多叉树(multiway tree)

  2. 多叉树通过重新组织节点,减少树的高度,能对二叉树进行优化

B树的基本介绍

B树通过重新组织节点,降低树的高度,并且减少I/O读写次数来提升效率

  1. 如图B树通过重新组织节点降低了树的高度

  2. 文件系统及数据库系统设计者利用了磁盘预读原理,将一个节点的大小设为等于一个页(页的大小为4k)这样每隔节点只需要一次I/O就可以完全载入

  3. 将树的度M设置为1024,在600亿个元素中最多只需要4次I/O操作就可以读取到想要的元素,B树广泛应用于文件存储系统以及数据库系统中

节点度:节点子树的个数

树的度:节点度的最大值是树的度

2-3树

基本介绍

  1. 2-3树是最简单的B-树结构

  2. 2-3树的所有叶子节点都在同一层

  3. 有两个子节点的节点叫二节点,二节点要么没有子节点,要么有两个子节点

  4. 有三个子节点的节点叫三节点,三节点要么没有子节点,要么有三个子节点

  5. 2-3树是由二节点和三节点构成的树

2-3树应用案例

要求

将数列{16,24,12,32,14,26,34,10,8,28,38,20}构建成2-3树,并保证数据插入的大小顺序。

插入规则

  1. 2-3树的所有叶子节点都在同一层

  2. 有两个子节点的节点叫二节点,二节点要么没有子节点,要么有两个子节点

  3. 有三个子节点的节点叫三节点,三节点要么没有子节点,要么有三个子节点

  4. 当按照规则插入一个数到某个节点时,不能满足上面的要求,就需要拆,先向上拆,如果上层满,则拆本层,拆后仍需满足上述条件

  5. 对于三节点的子树的值大小仍然遵循(BST 二叉排序树)的规则

构建过程图解

B树、B+树和B*树

B树
  • B-tree即B树,B即Balanced,平衡的意思。

  • 2-3树和2-3-4树都是B树

B树如图:

说明

  1. B树的阶:节点的最多的子节点个数

  2. B树的搜索,从根节点开始,对节点内的关键字(有序)序列进行二分查找,命中则退出,否则查找孩子节点,直到所对应的孩子指针为空,或已经是叶子节点

  3. 关键字分布在整棵树中,即叶子节点和非叶子节点都存放数据

  4. 搜索有可能在非叶子节点结束

  5. 其搜索性等价于在关键字全集内做一次二分查找

B+树
  • B+树是B树的变体,也是一种多路搜索树

如图:

说明

  1. B+树的搜索与B树基本相同,区别是B+树只有达到叶子节点才命中,其性能也等价于在关键字全集做一次二分查找

  2. 所有关键字都出现在叶子节点的链表中,数据只能在叶子节点(稠密索引),且链表中的关键字是有序的

  3. 非叶子节点相当于是叶子节点的所有(稀疏索引),叶子节点相当于是存储(关键字)数据的数据层

  4. 更适合文件索引系统

  5. B树和B+树各有自己的应用场景

B*树
  • B*树是B+树的变体,在B+树的非根和非叶子节点再增加兄弟指针

如图

说明

  1. B树定义了非叶子节点关键字个数至少为(2/3)M,即块的最低使用率为2/3,而B+树块的最低使用率为1/2

  2. 从第一个特点可以看出,B*树分配新节点的概率比B+树要低,空间使用率更高

所有源码都可在gitee仓库中下载:https://gitee.com/vvwhyyy/java_algorithm

Java数据结构(十五)—— 多路查找树的更多相关文章

  1. 数据结构和算法学习笔记十五:多路查找树(B树)

    一.概念 1.多路查找树(multi-way search tree):所谓多路,即是指每个节点中存储的数据可以是多个,每个节点的子节点数也可以多于两个.使用多路查找树的意义在于有效降低树的深度,从而 ...

  2. 数据结构(四十一)多路查找树(B树)

    一.多路查找树的背景 前面所讨论的查找算法都是在内存中进行的,它们适用于较小的文件,而对于较大的.存放在外存储器上的文件就不合适了,对于此类大规模的文件,即使是采用了平衡二叉树,在查找效率上仍然较低. ...

  3. 数据结构(六)查找---多路查找树(B树)

    B 树 B树与B+树 一:定义 B树(B-树)是一种平衡的多路查找树.-3树和2--4树都是B树的特例.节点最大的孩子数组称为B树的阶(order),因此,-3树是3阶B树,--4树是4阶B树. 二: ...

  4. 多路查找树之2-3-4树和B树 - 数据结构和算法82

    多路查找树之2-3-4树和B树 让编程改变世界 Change the world by program 由2-3树到2-3-4树 ...... 省略,具体请看视频讲解 ...... B树 一个m阶的B ...

  5. HTTP协议漫谈 C#实现图(Graph) C#实现二叉查找树 浅谈进程同步和互斥的概念 C#实现平衡多路查找树(B树)

    HTTP协议漫谈   简介 园子里已经有不少介绍HTTP的的好文章.对HTTP的一些细节介绍的比较好,所以本篇文章不会对HTTP的细节进行深究,而是从够高和更结构化的角度将HTTP协议的元素进行分类讲 ...

  6. 【查找结构5】多路查找树/B~树/B+树

    在前面专题中讲的BST.AVL.RBT都是典型的二叉查找树结构,其查找的时间复杂度与树高相关.那么降低树高自然对查找效率是有所帮助的.另外还有一个比较实际的问题:就是大量数据存储中,实现查询这样一个实 ...

  7. 多路查找树(2-3 树、2-3-4 树、B 树、B+ 树)

    本文参考自<大话数据结构> 计算机中数据的存储 一般而言,我们都是在内存中处理数据,但假如我们要操作的数据集非常大,内存无法处理了,在这种情况下对数据的处理需要不断地从硬盘等存储设备中调入 ...

  8. 二叉搜索树、AVL平衡二叉搜索树、红黑树、多路查找树

    1.二叉搜索树 1.1定义 是一棵二叉树,每个节点一定大于等于其左子树中每一个节点,小于等于其右子树每一个节点 1.2插入节点 从根节点开始向下找到合适的位置插入成为叶子结点即可:在向下遍历时,如果要 ...

  9. “全栈2019”Java第九十五章:方法中可以定义静态局部内部类吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. Statistical physics approaches to the complex Earth system(相关系统建模理念方法的摘要)

    本文翻译自"Statistical physics approaches to the complex Earth system",其虽然是针对复杂地球系统的统计物理方法的综述,但 ...

  2. 强迫自己学习Jquery三

    元素定位问题 offset 和 position必须要好好看一下,

  3. [MIT6.006] 22. Daynamic Programming IV: Guitar Fingering, Tetris, Super Mario Bro. 动态规划IV:吉他指弹,俄罗斯方块,超级玛丽奥

    之前我们讲到动态规划五步中有个Guessing猜,一般情况下猜有两种情况: 在猜和递归上:猜的是用于解决更大问题的子问题: 在子问题定义上:如果要猜更多,就要增加更多子问题. 下面我们来看如果像背包问 ...

  4. 无需开发,IT事件接入钉钉的方法详解

    1.市场在拥抱钉钉 虎嗅8月30日发表了一篇文章<为什么有很多企业沉迷钉钉无法自拔>,有兴趣的可以去看看,下附文章链接. 文章不短,其中有一部分阐述了:钉钉抓住以人为核心的"智能 ...

  5. 对“线上问题 不能gdb调试怎么处理??“”的思考

    Q1:线上问题的process 都为release版本!不带调试信息怎么查?(目前有时需要查线上问题, 不得不解决这个问题) 之前查问题都是编译环境编译一个带有debug信息的版本进行替换来调试,但是 ...

  6. fork函数拓展

    1.fork之后父子进程共享文件:文件引用计数的值改变,共享偏移. 在下面的例子中test.txt为parentchil.如果子进程没有睡眠,两个进程交叉执行,内容不可预测. 1 #include&l ...

  7. linx mysql安装

    文章引用:https://www.cnblogs.com/shizhongyang/p/8464876.html 只做了少量修改,感谢博主 注:未防止混淆,这里都用绝对路径执行命令 除了文件内容中的# ...

  8. Java 开发之 Lombok 必知必会

    转载链接地址:https://juejin.im/post/5cf3edf7e51d454f71439c79 1. 前言 在目前众多编程语言中,Java 语言的表现还是抢眼,不论是企业级服务端开发,还 ...

  9. yum安装no more mirrors to try

    先挂载:mount /dev/cdrom /mnt yum clean allyum makecacheyum -y update 后重试

  10. 金九银十已到!掌握这300道java高频面试题,助你面试BAT无忧!

    前言 不知不觉已经到了九月了,回首看年初的时候简直像做梦一样.不得不说时间真的是无情一般的流逝,题外话就不多说了!回归正题,现在已经到了今年最后一波大好的跳槽涨薪的时机了,错过了这一次可能你就得等到明 ...