一、引言

  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】的更多相关文章

  1. Size Balanced Tree(SBT树)整理

    不想用treap和Splay,那就用SB树把,哈哈,其实它一点也SB,厉害着呢. 先膜拜一下作者陈启峰.Orz 以下内容由我搜集整理得来. 一.BST及其局限性 二叉查找树(Binary Search ...

  2. 56. 2种方法判断二叉树是不是平衡二叉树[is balanced tree]

    [本文链接] http://www.cnblogs.com/hellogiser/p/is-balanced-tree.html [题目] 输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉 ...

  3. Size Balanced Tree(SBT) 模板

    首先是从二叉搜索树开始,一棵二叉搜索树的定义是: 1.这是一棵二叉树: 2.令x为二叉树中某个结点上表示的值,那么其左子树上所有结点的值都要不大于x,其右子树上所有结点的值都要不小于x. 由二叉搜索树 ...

  4. C基础 - 终结 Size Balanced Tree

    引言 - 初识 Size Balanced Tree 最近在抽细碎的时间看和学习 random 的 randnet 小型网络库. iamrandom/randnet - https://github. ...

  5. Size Balanced Tree

    Size Balanced Tree(SBT)是目前速度最快的平衡二叉搜索树,且能够进行多种搜索操作,区间操作:和AVL.红黑树.伸展树.Treap类似,SBT也是通过对节点的旋转来维持树的平衡,而相 ...

  6. 使用行为树(Behavior Tree)实现游戏AI

    ——————————————————————— 谈到游戏AI,很明显智能体拥有的知识条目越多,便显得更智能,但维护庞大数量的知识条目是个噩梦:使用有限状态机(FSM),分层有限状态机(HFSM),决策 ...

  7. 后缀树(suffix tree)

    参考: 从前缀树谈到后缀树 后缀树 Suffix Tree-后缀树 字典树(trie树).后缀树 一.前缀树 简述:又名单词查找树,tries树,一种多路树形结构,常用来操作字符串(但不限于字符串), ...

  8. 线段树 Interval Tree

    一.线段树 线段树既是线段也是树,并且是一棵二叉树,每个结点是一条线段,每条线段的左右儿子线段分别是该线段的左半和右半区间,递归定义之后就是一棵线段树. 例题:给定N条线段,{[2, 5], [4, ...

  9. 使用行为树(Behavior Tree)实现网游奖励掉落系统

    原地址:http://blog.csdn.net/akara/article/details/6165421 [原创]使用行为树(Behavior Tree)实现网游奖励掉落系统by AKara 20 ...

  10. 树-伸展树(Splay Tree)

    伸展树概念 伸展树(Splay Tree)是一种二叉排序树,它能在O(log n)内完成插入.查找和删除操作.它由Daniel Sleator和Robert Tarjan创造. (01) 伸展树属于二 ...

随机推荐

  1. golang基础结构

    1.命名 Go语言中的函数名.变量名.常量名.类型名.语句标号和包名等所有的命名,都遵循一个简单的命名规则:一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母.数字或下 ...

  2. 极简 Node.js 入门 - 3.3 文件写入

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  3. Leecode统计子串个数(java)

    /** 获取一个字符串在另一个字符串中出现的次数.判断str2在str1中出现的次数 */ public class StringExer2 { public static void main(Str ...

  4. 多元线性回归检验t检验(P值),F检验,R方等参数的含义

    做线性回归的时候,检验回归方程和各变量对因变量的解释参数很容易搞混乱,下面对这些参数进行一下说明: 1.t检验:t检验是对单个变量系数的显著性检验   一般看p值:    如果p值小于0.05表示该自 ...

  5. linux计算命令

    1.在lammps中通过car文件导出data文件 (进入工作目录xxx cd xxx/ msi2lmp.exe xxx -class I -frc clayff -i -ignore > ou ...

  6. jdk8的下载、安装、配置

    jdk官方网址:https://www.oracle.com/java/technologies/javase-downloads.html 小编微信和公众号(很高兴能与各位交流学习) 以下是具体步骤 ...

  7. Clock()函数简单使用(C库函数)

    Clock()函数简单使用(转) 存在于标准库<time.h> 描述 C 库函数 clock_t clock(void) 返回程序执行起(一般为程序的开头),处理器时钟所使用的时间.为了获 ...

  8. Qt setMouseTracking使用

    Qt setMouseTracking使用(转载)   bool mouseTracking 这个属性保存的是窗口部件跟踪鼠标是否生效. 如果鼠标跟踪失效(默认),当鼠标被移动的时候只有在至少一个鼠标 ...

  9. 极简 Node.js 入门 - 3.5 文件夹操作

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  10. JAVA中 错误代码是 the public type must be defined in its own file 解决方法 android开发 java编程

    一般是由于定义的JAVA类同文件名不一致: 解决方法: 1.把文件名修改同XYZ一样的名字: 2.把类名修改成同文件名: