从多路搜索树到 B-树
1. 什么是 B 树
- B 树是为磁盘或其他直接存取的辅助存储设备而设计的一种平衡二叉树;
- B 树类似于红黑树,但它们在降低磁盘 I/O 操作数方面要更好一点,
- 许多数据库系统使用 B 树或者 B 树的变种来存储信息;
2. B 树的用武之地 —— 外存搜索
当数据规模大到内存已不足以容纳时(此时就需要存放在外存中),常规平衡二叉搜索树的效率将大打折扣。其原因在于,查找过程对外存的访问次数过多。例如,若将 109(1 billion = 10 亿)个记录在外存中组织为 AVL 时,则每次查找大致都需要做 30 次外存访问。那么,应该如何有效减少外存操作呢?
为此需要充分利用磁盘之类外部存储器的一个特性,单就时间成本而言,读取物理地址连续的 1000 个字节,与读取单个字节几乎没有区别。也即外部存储更适宜于批量式访问,不妨通过时间成本相对较低的多次内存操作,来替代时间成本相对较高的单次外存操作。
相应地,需要将通常的二叉搜索树,改造为多路搜索树 —— 在中序遍历的意义下,这也是一种等价变换。
- 以两层为间隔,结点与其左孩子、右孩子,合并为一个大节点(3 个关键码),下分 4 路,进而得到四路搜索树;
- 以三层为间隔,结点与其两个孩子四个孙子合并为一个含有 7 个关键码(key)、8 个分支的“大结点”,进而得到 8 路搜索树;
- 一般地,以 k 层为间隔进行重组,会将二叉搜索树转化为等价的 2k 路搜索树,统称多路搜索树;
从多路搜索树到 B-树的更多相关文章
- 数据结构学习笔记_树(二叉搜索树,B-树,B+树,B*树)
一.查找二叉树(二叉搜索树BST) 1.查找二叉树的性质 1).所有非叶子结点至多拥有两个儿子(Left和Right): 2).所有结点存储一个关键字: 3).非叶子结点的左指针指向小于其关键字的子树 ...
- 从二叉搜索树到AVL树再到红黑树 B树
这几种树都属于数据结构中较为复杂的,在平时面试中,经常会问理解用法,但一般不会问具体的实现,所以今天来梳理一下这几种树之间的区别与联系,感谢知乎用户@Cailiang,这篇文章参考了他的专栏. 二叉查 ...
- [LeetCode] 538. 把二叉搜索树转换为累加树 ☆(中序遍历变形)
把二叉搜索树转换为累加树 描述 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和. ...
- Java实现 LeetCode 538 把二叉搜索树转换为累加树(遍历树)
538. 把二叉搜索树转换为累加树 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和 ...
- 数据结构中的树(二叉树、二叉搜索树、AVL树)
数据结构动图展示网站 树的概念 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>=1)个有限节点组成一个具有 ...
- 二叉搜索树、B树
二叉搜索树又叫二叉排序树. B树又可写为B-树,“B-树”种的“-”无区分意义. 此外,还有B+树,B*树.
- 算法二叉搜索树之AVL树
最近学习了二叉搜索树中的AVL树,特在此写一篇博客小结. 1.引言 对于二叉搜索树而言,其插入查找删除等性能直接和树的高度有关,因此我们发明了平衡二叉搜索树.在计算机科学中,AVL树是最先发明的自平衡 ...
- [Swift]LeetCode538. 把二叉搜索树转换为累加树 | Convert BST to Greater Tree
Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original B ...
- Leetcode 538. 把二叉搜索树转换为累加树
题目链接 https://leetcode.com/problems/convert-bst-to-greater-tree/description/ 题目描述 大于它的节点值之和. 例如: 输入: ...
随机推荐
- git 常用命令(分支)
查看分支 git branch -r 修改分支名字dev-->test git branch -m dev test 切换分支dev git checkout dev 创建本地分支dev git ...
- hdu5387 Clock
Problem Description Give a time.(hh:mm:ss).you should answer the angle between any two of the minute ...
- C#里如何把一个DataTable的数据追加进数据库里的某个表
方法一: DataTable table = new DataTable(); //TODO: init table... string connStr = "user id=" ...
- 利用mysql5.6 的st_distance 实现按照距离远近排序。 (转载)
http://blog.csdn.net/zhouzhiwengang/article/details/53612481
- Android实践之ScrollView中滑动冲突处理
转载注明出处:http://blog.csdn.net/xiaohanluo/article/details/52130923 1. 前言 在Android开发中,假设是一些简单的布局.都非常easy ...
- HDOJ 5409 CRB and Graph 无向图缩块
无向图缩块后,以n所在的块为根节点,dp找每块中的最大值. 对于每一个桥的答案为两块中的较小的最大值和较小的最大值加1 CRB and Graph Time Limit: 8000/4000 MS ( ...
- amazeui学习笔记--css(常用组件5)--评论列表Comment
amazeui学习笔记--css(常用组件5)--评论列表Comment 一.总结 1.am-comment:使用am-comment来声明评论对象,这个是放在article里面的,虽然article ...
- oled的一套stm32实验2(自己的实验)
stm32与OLED屏接口的引脚介绍: CS————GPIOD3: RST————GPIOD4: DC—————GPIOD5: D0——————GPIOD6: D1——————GPIOD7; 上是我参 ...
- vim编辑器经常使用命令
高级一些的编辑器,都会包括宏功能,vim当然不能缺少了.在vim中使用宏是很方便的: :qx 開始记录宏,并将结果存入寄存器xq 退出记录模式@x 播放记录在x寄存器中的宏命令 ...
- 开发板 视频1 05_01 05_02 05_03 关于ubuntu的一些操作
ctrl+alt+T 打开中端 ctrl+d 退出 ctrl+alt+f1 到f6 进入dos中端 ctrl+alt+f7 是退出 05_02 启动root用户 也就是进入 前面出现root了 ...