B树【Balanced-Tree】
一、引言
B树是二叉平衡树的一个变种,在学习之前,我们先了解一下二分法,二叉树的一些相关的基本概念,有助于我们更好的理解B树~
二、二叉树
定义:二叉树即二叉平衡树
意义:通过二分法来进行元素查找,时间复杂度为O(logn)
查找元素的流程:

解析:我们可以通过上图(画功有限,请见谅...)看到,二叉树具有以下几个特征:
- 非叶子节点都有2个分支【非叶子节点2个孩子】
- 左侧分支的值比右侧分支的元素要小【左小右大】
- 查询元素时通过与当前节点元素进行比较大小,若小于当前节点的元素走左侧分支,大于当前节点的元素时,则走右侧分支【查询时,小于走左边,大于走右边】
优势:
- 若非最悲观的情况(即查到最后一层)或者查询的层数不高的时候,可以比较快的返回相应的元素(但通常这个查询深度不可控,因为不确定查的元素在第几层)
- 每一个节点都存有对应的元素,若获取的元素正好在当前节点时,则不再继续往下走了,磁盘IO就会少一些。
劣势:
当查询深度较高时,会增加磁盘IO的次数,影响效率(图中以每取一次节点进行一次磁盘IO为例)
三、B树
定义:B树即多路平衡查找树
常见应用:文件系统和部分非关系型数据库的索引,如MongoDB
优势:树用作数据库索引主要是因为查询效率高,而且可以保持有序
查找元素的流程:

原则:一个m阶的B树(Balance Tree)具有如下几个特征:
- 1、根结点至少有两个子女。
- 2、每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m
- 3、每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m
- 4、所有的叶子结点都位于同一层。
- 5、每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。
解析:我们可以对着上面的原则进行解析,图中是一个3阶的B树,那么m为3,m/2 <= k <= m则k可以取2,3,k-1就是1,2了。
- 1、根结点至少有两个子女【根节点是9,有2个子女】
- 2、每个中间节点都包含k-1【1~2】个元素和k【2~3】个孩子,其中 m/2 <= k <= m,满足
- 3、每一个叶子节点都包含k-1【1~2】个元素,其中 m/2 <= k <= m
- 4、所有的叶子结点都位于同一层。
- 5、每个节点中的元素从小到大排列,节点当中k-1【1~2】个元素正好是k【2~3】个孩子包含的元素的值域分划。
优势:
- 存放同样多的元素时,树的高度变小了,相当于减少了磁盘IO次数,提升性能
- 当查询进入了一个有很多元素的节点时,也只是存在于内存中进行比较,相对于磁盘IO的速度来说,消耗的时间可以忽略不计【这也是为什么在节点上进行“扩容”】
劣势:
- 相对于B+树来说,每个节点都会存数据,同样大小的磁盘页存的节点元素会少些
- 查询性能不稳定,比如有时可能会查到底层的叶子节点,有时可能查到最上层的根节点就返回了,每次查询的消耗不稳定,查询耗时波动大。
- 范围查询不方便,比如图中我要查询符合6~10的所有元素,而6~10的元素从根节点开始就分布在2侧的树中,所以需要经过的中序遍历非常繁杂
参考资料:
B树【Balanced-Tree】的更多相关文章
- Size Balanced Tree(SBT树)整理
不想用treap和Splay,那就用SB树把,哈哈,其实它一点也SB,厉害着呢. 先膜拜一下作者陈启峰.Orz 以下内容由我搜集整理得来. 一.BST及其局限性 二叉查找树(Binary Search ...
- 56. 2种方法判断二叉树是不是平衡二叉树[is balanced tree]
[本文链接] http://www.cnblogs.com/hellogiser/p/is-balanced-tree.html [题目] 输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉 ...
- Size Balanced Tree(SBT) 模板
首先是从二叉搜索树开始,一棵二叉搜索树的定义是: 1.这是一棵二叉树: 2.令x为二叉树中某个结点上表示的值,那么其左子树上所有结点的值都要不大于x,其右子树上所有结点的值都要不小于x. 由二叉搜索树 ...
- C基础 - 终结 Size Balanced Tree
引言 - 初识 Size Balanced Tree 最近在抽细碎的时间看和学习 random 的 randnet 小型网络库. iamrandom/randnet - https://github. ...
- Size Balanced Tree
Size Balanced Tree(SBT)是目前速度最快的平衡二叉搜索树,且能够进行多种搜索操作,区间操作:和AVL.红黑树.伸展树.Treap类似,SBT也是通过对节点的旋转来维持树的平衡,而相 ...
- 使用行为树(Behavior Tree)实现游戏AI
——————————————————————— 谈到游戏AI,很明显智能体拥有的知识条目越多,便显得更智能,但维护庞大数量的知识条目是个噩梦:使用有限状态机(FSM),分层有限状态机(HFSM),决策 ...
- 后缀树(suffix tree)
参考: 从前缀树谈到后缀树 后缀树 Suffix Tree-后缀树 字典树(trie树).后缀树 一.前缀树 简述:又名单词查找树,tries树,一种多路树形结构,常用来操作字符串(但不限于字符串), ...
- 线段树 Interval Tree
一.线段树 线段树既是线段也是树,并且是一棵二叉树,每个结点是一条线段,每条线段的左右儿子线段分别是该线段的左半和右半区间,递归定义之后就是一棵线段树. 例题:给定N条线段,{[2, 5], [4, ...
- 使用行为树(Behavior Tree)实现网游奖励掉落系统
原地址:http://blog.csdn.net/akara/article/details/6165421 [原创]使用行为树(Behavior Tree)实现网游奖励掉落系统by AKara 20 ...
- 树-伸展树(Splay Tree)
伸展树概念 伸展树(Splay Tree)是一种二叉排序树,它能在O(log n)内完成插入.查找和删除操作.它由Daniel Sleator和Robert Tarjan创造. (01) 伸展树属于二 ...
随机推荐
- golang安装及vscode编辑器配置
安装Go语言及搭建Go语言开发环境 下载 下载地址:https://studygolang.com/dl 系统选择: 根据不同系统下载安装包: 安装 Windows MAC安装 点开可执行程序 下一步 ...
- [转]camera教程
camera教程 Lens一般由几片透镜组成透镜结构,按材质可分为塑胶透镜(plastic)或玻璃透镜(glass),玻璃镜片比树脂镜片贵.塑胶透镜其实是树脂镜片,透光率和感光性等光学指标比不上镀膜镜 ...
- Java数据结构——循环队列
普通顺序队列存在的问题在普通顺序队列中,入队的操作就是先将尾指针rear右移一个单位,然后将元素值赋值给rear单位.出队时,则是头指针front后移一个单位.像这样进行了一定数量的入队和出队操作后, ...
- vue混入mixins时注意的问题
mixin.js - 方式一:导出对象 const mixin = { mounted () { console.log('fffffffffffff') }, methods: { } } expo ...
- oracle坑。
char(2)的,后面的有一个空格.删不掉.在plsql里可以正常查.写死的sql在程序也可以正常查. 程序用占位符的形式,不能查出来.只能转成to_number select t.*,t.rowid ...
- vue项目打包上线发现 360 浏览器不兼容?
分享链接: 文档:解决vue 和 360 浏览器兼容问题.note链接:http://note.youdao.com/noteshare?id=41914c6dbb4238d765b26d59aa05 ...
- 用 Spring Boot 和 MybatisPlus 快速构建项目
自动生成 public class MPGenerator { public static void main(String[] args) { AutoGenerator autoGenerator ...
- 非旋Treap——维护数列
https://www.luogu.org/problemnew/show/P3391 知识点:1.split:1.拆数值 2.拆排名 2.merge 3.截取l - r这个区间,先截l - 1出来, ...
- C015:十进制转8进制
程序: #include "stdafx.h" #include <string.h> int _tmain(int argc, _TCHAR* argv[]) { i ...
- Java8的日期时间处理
代码: package com.ufo.java8datetime; import java.time.Clock; import java.time.LocalDate; import java.t ...