对B+树,B树,红黑树的理解

 出处:https://www.jianshu.com/p/86a1fd2d7406mysql

写在前面,好像不一样的教材对b树,b-树的定义不同。我就不纠结这个究竟是叫b-树仍是b-树了。sql

如图所示,区别有如下两点:数据库

  1. B+树中只有叶子节点会带有指向记录的指针,而B树则全部节点都带有,在内部节点出现的索引项不会再出如今叶子节点中。
  2. B+树中全部叶子节点都是经过指针链接在一块儿,而B树不会。

B+树的优势:数据结构

  1. 非叶子节点不会带上指向记录的指针,这样,一个块中能够容纳更多的索引项,一是能够下降树的高度。二是一个内部节点能够定位更多的叶子节点。
  2. 叶子节点之间经过指针来链接,范围扫描将十分简单,而对于B树来讲,则须要在叶子节点和内部节点不停的往返移动。具体的来说,如何想扫描一次全部数据,对于b+树来讲,能够从由于他们的叶子结点是连在一块儿的,因此能够横向的遍历过去。而对于b-树来讲,就这能中序遍历了。

B树的优势:
对于在内部节点的数据,可直接获得,没必要根据叶子节点来定位。性能

B树长什么样子?mysql索引

红黑树和B树应用场景有何不一样?
为何要设计红黑树?

  先说一下红黑树,红黑树有一个比较复杂的规则,红的结点balala怎么样,黑的结点balalal怎么样。大一大二学这些的时候,傻呵呵的想背课文同样背下来,当也不知道为何要设计成这样。换一句话说,为何平衡树和红黑树的区别是什么?为何有了平衡树还要设计出来红黑树?spa

红黑树的规则:
1)每一个结点要么是红的,要么是黑的。
2)根结点是黑的。
3)每一个叶结点(叶结点即指树尾端NIL指针或NULL结点)是黑的。
4)若是一个结点是红的,那么它的俩个儿子都是黑的。
5)对于任一结点而言,其到叶结点树尾端NIL指针的每一条路径都包含相同数目的黑结点。设计

  如今想一想,个人理解是平衡树(AVL)更平衡,结构上更加直观,时间效能针对读取而言更高,可是维护起来比较麻烦!!!(插入和删除以后,都须要rebalance)。可是,红黑树经过它规则的设定,确保了插入和删除的最坏的时间复杂度是O(log N) 。指针

设计红黑树的目的,就是解决平衡树的维护起来比较麻烦的问题,红黑树,读取略逊于AVL,维护强于AVL,每次插入和删除的平均旋转次数应该是远小于平衡树。blog

小结一下:

能用平衡树的地方,就能够用红黑树。用红黑树以后,读取略逊于AVL,维护强于AVL。

红黑树 和 b+树的用途有什么区别?
  1. 红黑树多用在内部排序,即全放在内存中的,STL的map和set的内部实现就是红黑树。

  2. B+树多用于外存上时,B+也被成为一个磁盘友好的数据结构。

为何b+磁盘友好?

  1. 磁盘读写代价更低
    树的非叶子结点里面没有数据,这样索引比较小,能够放在一个blcok(或者尽量少的blcok)里面。避免了树形结构不断的向下查找,而后磁盘不停的寻道,读数据。这样的设计,能够下降io的次数。

  2. 查询效率更加稳定
    非终结点并非最终指向文件内容的结点,而只是叶子结点中关键字的索引。因此任何关键字的查找必须走一条从根结点到叶子结点的路。全部关键字查询的路径长度相同,致使每个数据的查询效率至关。

  3. 遍历全部的数据更方便
    B+树只要遍历叶子节点就能够实现整棵树的遍历,而其余的树形结构 要中序遍历才能够访问全部的数据。

题外话:为何mysql索引使用b+树而不使用红黑树?

  b+树就是为文件存储而生的。若是数据库文件存储在主存中我认为两种结构的查询速度差距不是很大,由于主存的查找速度很是快。而数据库文件实际存储在磁盘中,定位一行信息须要查找该行文件所在柱面号,磁盘号,扇区号,页号这个阶段是很耗费时间的。每一次的定位请求意味着要作一次IO操做,也意味着成倍的时间消耗。所以减小IO查询的次数是提升查询性能的关键。而IO的查询次数就是索引树的高度,高度越低查询的次数越少。一样的结点次数红黑树的高度最多为2log(n+1),而B+树的高度最多为(logt (n+1)/2)+1,随着t增大高度会更小,IO次数也会减小。

相关文章
相关标签/搜索