心里有没有点B树(B-Tree)



640?wx_fmt=gif

导语:

二叉树作为一种数据结构,其作用就是高效的遍历查找。为什么能支撑上百万上千万的数据库体量,又有哪些巧妙的设置能够提高效率。本文总结了树结构的理论和原理,愿与诸君共勉.....



二叉树(Binary Tree)

二叉树是个有限元素的集合,该集合或者为空或者有一个称为根(Root)的元素及两个不相等的,被分别称为左子树和右子树的二叉树组成。当集合为空时,该二叉树称为空二叉树,在二叉树中一个元素也称为一个结点。

  • 结点的度:结点拥有所有子树的个数称为结点的度

  • 叶子结点:度为0的结点称为叶子结点,也称为终端结点

  • 分枝结点:度不为0的结点称为分枝结点,一棵树的结点除叶子结点外,其余的都是分枝结点

  • 树中的一个结点的子树的根结点称为这个结点的孩子。这个结点称为它孩子结点的双亲,具有同一双亲的结点互为兄弟

  • 在树中,有一条路径从结点m到结点n,那么m就称为n的祖先,而n称为m的子孙

  • 规定树的根结点的层次数为1,其余结点的层次数等于它双亲结点层数加1

  • 树中所有结点的最大层次数称为深度

  • 在二叉树中,如果所有分支的结点都存在左子树和右子树,并且所有的叶子结点在同一层上,这样称为满二叉树

  • 一棵深度为k有n个结点的二叉树,对树中结点从上至下,从左到右的顺序进行编号,如果编号的结点与满二叉树中的结点位置相同,则这棵二叉树称为完全二叉树




平衡二叉树(AVL Tree)

按照二叉树的定义,左子树和右子树是有顺序的,左子树的值要小于父结点,右子树的值要大于父结点。如果一个数组顺序插入到一个数据结构,正常情况下会变成一个有序的二叉树。但是如果最坏的结果,如果按照升序排列后再插入,会导致这棵树严重倾斜,最后一棵树会退化为一个线性链表,这样就会失去树的查询效率优势。

  • 平衡二叉树是一种特殊的二叉树,所以它满足所有二叉树的特性,

  • 除此之外还要满左右两个子树的高度的绝对值不超过1

  • 并且左右子树都是一棵二叉树。

640?wx_fmt=jpeg


B-Tree

一个高度为n的平衡二叉树可以容纳2^0+2^1+2^2+....+2^(n-1)个结点数。如果存储100w条数据平衡二叉树的高度为20。也就是说如果是二分查找法,最坏的情况需要查找20次。如果是内存运算效率是不影响,但树如果是数据库存储就需要IO操作。那么有没有办法在存储同样体量的数据减少树的高度,而增加每一层的结点。

  • 一棵m阶的B-Tree每个结点最多m个子结点

  • 除了根结点和叶子结点外,每个结点最少有m/2(向上取整)个子结点

  • 如果根结点不是叶子结点,那根结点至少包含两个子结点

  • 所有的叶子结点都位于同一层

  • 每个结点都包含k个元素(关键字)

  • 每个结点中的元素(关键字)从小到大排列

  • 每个元素左结点的值都小于或等于   该元素。右结点的值都大于或等于该元素

640?wx_fmt=jpeg


B+Tree

B+Tree是在B-Tree基础上的一种优化,使其更适合存储索引的结构。B+Tree有自己几个特性。

  • 所有的非叶子结点只存储关键字信息

  • 所有的卫星数据(具体数据)都存在叶子结点中

  • 所有的叶子结点中包含了全部元素的信息

  • 所有的叶子结点之间都有一个链指针

  • 由于B+Tree的非叶子结点只存储关键字信息,所以同一个单位的内存B+Tree存储的数据会更多

640?wx_fmt=jpeg


文献参考:


https://www.jianshu.com/p/a14ea51a4458


推荐阅读:


Java美好的承诺,自动回收垃圾


K8S 到底是个啥


一次MySQL千万级大表优化过程


Full Gc分析与排查指南




曾今有人关注了我,

后来他找到了女朋友

640?wx_fmt=jpeg

640?wx_fmt=png

点击文末右下角的 “在看” 解锁更多惊喜哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值