1. 什么是 B 树

  • B 树是为磁盘或其他直接存取的辅助存储设备而设计的一种平衡二叉树

    • B 树类似于红黑树,但它们在降低磁盘 I/O 操作数方面要更好一点,
    • 许多数据库系统使用 B 树或者 B 树的变种来存储信息;

2. B 树的用武之地 —— 外存搜索

当数据规模大到内存已不足以容纳时(此时就需要存放在外存中),常规平衡二叉搜索树的效率将大打折扣。其原因在于,查找过程对外存的访问次数过多。例如,若将 10910^9(1 billion = 10 亿)个记录在外存中组织为 AVL 时,则每次查找大致都需要做 30 次外存访问。那么,应该如何有效减少外存操作呢?

为此需要充分利用磁盘之类外部存储器的一个特性,单就时间成本而言,读取物理地址连续的 1000 个字节,与读取单个字节几乎没有区别。也即外部存储更适宜于批量式访问,不妨通过时间成本相对较低的多次内存操作,来替代时间成本相对较高的单次外存操作。

相应地,需要将通常的二叉搜索树,改造为多路搜索树 —— 在中序遍历的意义下,这也是一种等价变换。

  • 以两层为间隔,结点与其左孩子、右孩子,合并为一个大节点(3 个关键码),下分 4 路,进而得到四路搜索树;
  • 以三层为间隔,结点与其两个孩子四个孙子合并为一个含有 7 个关键码(key)、8 个分支的“大结点”,进而得到 8 路搜索树;
  • 一般地,以 k 层为间隔进行重组,会将二叉搜索树转化为等价的 2k2^k 路搜索树,统称多路搜索树;

从多路搜索树到 B-树相关推荐

  1. 种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林

    虽然今天不是植树节,但是我今天想种树. 文章目录 树,什么是树? 二叉树 定义 二叉树的创建 二叉树的前中后序遍历 前序遍历: 中序遍历 后序遍历 已知前序.中序遍历结果,还原二叉树 已知后序.中序遍 ...

  2. 【数据结构与算法】之深入解析“把二叉搜索树转换为累加树”和“从二叉搜索树到更大和树”的求解思路与算法示例

    一.题目要求 ① 把二叉搜索树转换为累加树 给出二叉搜索树的根节点,该树的节点值各不相同,请将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 no ...

  3. [二叉树遍历|BST]leetcode 538 把二叉搜索树转换为累加树

    [二叉树遍历|BST]leetcode 538 把二叉搜索树转换为累加树 1.题目 题目链接 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree) ...

  4. leetcode c++未初始化_LeetCode 力扣官方题解 | 538. 把二叉搜索树转换为累加树

    力扣 538. 把二叉搜索树转换为累加树(点击查看题目) 力扣​leetcode-cn.com 题目描述 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater ...

  5. Suzy找到实习了吗 Day23 | 二叉树最后一节!669. 修剪二叉搜索树,108. 将有序数组转换为二叉搜索树,538. 把二叉搜索树转换为累加树

    669. 修剪二叉搜索树 题目 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high.通过修剪二叉搜索树,使得所有节点的值在[low, high]中.修剪树 不应该 改变保 ...

  6. Python算法之多路搜索树(B-Tree)的实现(三)

    B-Tree每个结点可以有n个元素和n+1个孩子,这样可以减少树的高度,于是降低内存读取外存的次数. 特点:1.多路查找. 2.树每个结点孩子个数可以 > 2. 3.每个结点可以存储多个数据元素 ...

  7. Leetcode 538. 把二叉搜索树转换为累加树 C++

    Leetcode 538. 把二叉搜索树转换为累加树 题目 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加 ...

  8. LeetCode 538. 把二叉搜索树转换为累加树 | Python

    538. 把二叉搜索树转换为累加树 题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/convert-bst-to-greater-tree 题目 给 ...

  9. LeetCode 力扣 538. 把二叉搜索树转换为累加树 convertBstToGreaterTree538树

    大家觉得写还可以,可以点赞.收藏.关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录 538. 把二叉搜索树转换为累 ...

最新文章

  1. Android之linux基础教学之八 内核同步介绍
  2. 在多字节的目标代码页中,没有此 Unicode 字符可以映射到的字符
  3. [转]正确配置Linux系统ulimit值的方法
  4. maskrcnn还可以加网络吗_桃子加蜂蜜可以榨汁吗?桃子和蜂蜜可以一起吃吗?原来可以这样吃...
  5. matlab拔河比赛_拔河比赛
  6. 软件 Bug 引发的致命事故,程序员责任何在?| 技术头条
  7. python 时间戳_Python打牢基础,从19个语法开始!
  8. JQuery使用总结
  9. 矩阵论作业13,14,15讲
  10. 下载超星或读秀图书时,怎么搞定完整书签?
  11. 单AP对多终端无线上行带宽下降问题
  12. 单条SQL语句实现复杂逻辑几例(转)
  13. html中橘色代码,javascript HTML+CSS实现经典橙色导航菜单
  14. 【蓝桥杯-单片机学习笔记(十五)】NE555频率测量
  15. 10个可以实现高效工作与在线赚钱的 AI 工具网站
  16. Axure-图片放大缩小
  17. 【UN-JS-工具类】懒加载的实现 -- 两种方式 --- 一种5行JS实现懒加载
  18. 小学计算机教学的趣味性,小学计算机教学中趣味性教学策略的研究
  19. 普渡机器人“欢乐送”入驻武藏日本料理,助其降本增效
  20. 【百度地图API】如何获取行政区域的边界?(转载)

热门文章

  1. Linux passwd系统错误,Linux系统处理”passwd: Authentication token manipulation error”错误...
  2. linux做伪分布时ip设置,Linux下伪分布模式的Hadoop部署
  3. php strip_tag 回车,详解PHP函数 strip_tags 处理字符串缺陷bug
  4. matlab中求方差的,matlab中求方差为什么除以n-1?
  5. Ros无法自动补全命令的解决
  6. Linux添加相对库路径,Linux C编程(8) 使用相对路径加载动态库-rpath和$ORIGIN
  7. roadrunner监控linux服务器,Jenkins添加TPS与服务器监控变化曲线图
  8. mysql定义语言_MySQL基础(一)--数据定义语言DDL
  9. android自定义协议,Android / iOS-自定义URI /协议处理
  10. linux 过滤某种类型文件,linux mv 类型过滤