一、引言

  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. cinderclient命令行源码解析

    一.简介 openstack的各个模块中,都有相应的客户端模块实现,其作用是为用户访问具体模块提供了接口,并且也作为模块之间相互访问的途径.Cinder也一样,有着自己的cinder-client. ...

  2. DVWA之文件上传(二)

    <?php if( isset( $_POST[ 'Upload' ] ) ) { // Where are we going to be writing to? $target_path = ...

  3. python - Lambda函数 匿名函数

    Lambda 匿名函数 python 使用 lambda 来创建匿名函数. lambda只是一个表达式,函数体比def简单很多. lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda ...

  4. Cookie:SameSite,防止CSRF攻击

    前言 最近在本地调试时,发现请求接口提示“未登录”,通过分析HTTP请求报文发现未携带登录状态的Cookie: PS:登录状态Cookie名是TEST 再进一步分析,发现Cookie的属性SameSi ...

  5. Android开发之解决Error:(16) Error: "ssdk_baidutieba_client_inavailable" is not translated in "en" (Englis

    由于添加ShareSDK文件,导致打包突然报错, 错误信息: Error:(16) Error: "baidutieba_client_inavailable" is not tr ...

  6. 详细了解JS Map,它和传统对象有什么区别?

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:https://www.codeproject.com/Articles/5278387/Under ...

  7. 用LR录制终于可以在我的电脑上顺利弹出IE了

    之前在我的电脑上各种折腾,由于是win764bit+IE11,安装了LR11连最基本的录制都没能搞定.google之后各种的尝试,也没能解决问题.狠下心来把IE11换成了IE8,终于可以勉强使用了,没 ...

  8. 关于js与jquery中的文档加载

    jquery中的$(document).ready()类似于javascript中的window.onload(),但是其中还是有很大区别的 1.jquery中的可以简化为$().ready(),$( ...

  9. bootstrap的时间控件使用(双日历)

    这段时间看了下bootstrap的时间控件,发现使用起来还是很简单的,趁着有时间的时候整理了一下,方便自己以后忘记的时候查阅... 废话不多说先上效果图 接下来是代码实现 第一步当然是导入css.js ...

  10. Web最最基础2

    网页元素HTML 列表 (1)无序列表 <ul> <li>****</li> <li>***</li></ul> 更多样式:&l ...