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) 伸展树属于二 ...
随机推荐
- SpringBoot项目 使用Jenkins进行自动化部署 (gitLab管理项目)_
1.部署服务器创建好对应文件夹和启动脚本 创建文件夹 mkdir /wdcloud/app/rps/rps-module-category 创建启动脚本 cd /wdcloud/app/rps/rps ...
- Apache Hudi 0.6.0版本重磅发布
1. 下载信息 源码:Apache Hudi 0.6.0 Source Release (asc, sha512) 二进制Jar包:nexus 2. 迁移指南 如果您从0.5.3以前的版本迁移至0.6 ...
- 网站seo整站优化有什么优势
http://www.wocaoseo.com/thread-314-1-1.html 现在很多企业找网络公司做网站优化,已经不再像以前那样做目标关键词,而是通过整站优化来达到企业营销目的 ...
- 阿里大牛教你基于Python的 Selenium自动化测试示例解析
今天给大家讲解的是自动化测试示例的解析,如有不对的地方请多多指教. 自动化测试示例如下: from selenium import webdriver from selenium.webdriver. ...
- typedef的陷阱
typedef定义了一种类型的新别名,不同于宏,它不是简单的字符串替换.比如: 先定义: typedef char* PSTR; 然后: int mystrcmp(const PSTR, const ...
- 基于Rust-vmm实现Kubernetes运行时
随着容器及K8s的广泛使用,越来越多的容器安全与隔离问题被暴露出来,如:容器逃逸.水平攻击.DDos攻击等严重威胁了办公和生产环境的安全与稳定,影响了业务的正常运行.安全容器技术孕育而生,产生了kat ...
- Labview学习之路(三)前面板数值控件
首先看一下前面板都有什么数值控件(我用的labview是17年的,其他版本可能会有不同) 我个人将他们分成了六个部分 第一部分 这个部分大家很好理解,数值输入数值输出,时间输入和时间输出,这里我们讲一 ...
- Shader HLSL片段说明
在编写顶点着色器或者片段着色器时,需要用到CG或者HLSL语言,这里翻译unity官网的信息. 编译指令 #pragma vertex name - 编译函数名成vertex shader #prag ...
- Spring JPA 定义查询方法
Spring JPA 定义查询方法 翻译:Defining Query Methods 存储库代理有两种方式基于方法名派生特定域的查询方式: 直接从方法名派生查询 自定义查询方式 可用选项基于 ...
- HDOJ 1003
动态规划一直AC不了竟然是因为一厢情愿的多加了一个#! printf("Case #%d:\n",count); --------------------------------- ...