B树和B+树

1、概念

  • 度(Degree程度):节点拥有的直接孩子个数,度为0的节点称为叶子节点。就是叉的个数。
  • 阶(度):一个节点的子节点个数,树的阶为所有节点中阶最大的节点的阶。就是叉的个数。
  • 树的度:树内节点度最大的那个是树的度。
  • 深度(高度):根节点为第一层,深度为0,往下依次,最大层次称为数的深度或者高度。
  • 最小不平衡子树:距离插入节点最近的,且平衡因子绝对值大于1的节点为根的子树。
  • 满二叉树:除叶子节点外,所有节点都有两个子节点。
  • 完全二叉树:叶子节点在最后一层且是从左往右排列。

2、二叉排序树(二叉查找树)

  • 是一棵二叉树;
  • 若任意节点左子树不为空,左子树上所有节点值小于根节点值;
  • 若任意节点右子树不为空,右子树上所有节点值大于根节点值。

3、平衡二叉树(AVL树)

Adelson-Velsky and Landis Tree是以人名命名的。

  • 是一棵二叉排序树;
  • 任意节点左右子树高度差不超过1。

4、红黑树

  • 每个节点颜色不是黑色,就是红色
  • 根节点是黑色的
  • 叶子节点是黑色的
  • 如果一个节点是红色,那么它的两个子节点就是黑色的(没有连续的红节点)
  • 对于每个节点,从该节点到其后代叶节点的简单路径上,均包含相同数目的黑色节点

这几个规则最终的效果就是:从根到叶子的最长的可能路径不多于最短的可能路径的两倍长,使得维护树平衡的代价和搜索性能得到一个平衡。

了解红黑树,可以先从2-3-4树开始,

5、B树(多路查找树)

一个m阶B树需要满足的条件:

  • 每个节点最多只有m个子节点。(因为是m阶)
  • 每个内部节点(根节点和叶子节点之间的节点)具有至少m/2个子节点。
  • 如果根不是叶节点,则根至少有两个子节点。
  • 具有k个子节点的非叶节点包含k -1个键。
  • 所有叶子都出现在同一水平(所以所有叶子高度都一致)。

上面的定义很晦涩,总结来说就是B树每个节点都包含数据,且所有叶子节点都在一层,看起来B树应该是一个很整齐的树,没有参差不齐。

6、B+树

  • 有m个子树的中间节点包含有m个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引;
  • 所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息);
  • 所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息);

B+树只有叶子节点包含数据,非叶子节点只有索引,B+树的叶子节点也在同一层,这一点和B树一样,但是B+树的叶子节点通过指针链接,所以是按索引顺序形成的链,这样在根据索引进行范围查询时也会很快。B树和B+树组织的数据都存放在磁盘上,而且实际使用时,数据量不会小,所以在进行查询时,是需要多次进行磁盘IO操作的,mongodb使用b树的原因是他多进行key的搜索,数据分布在节点上,平均下来磁盘IO会较少,如果使用B+树,必须进行到叶子节点才能取出数据,平均下来磁盘IO会较多。MySQL使用的是B+树组织聚簇索引,在进行等值查询时,效果确实不如B树,但是MySQL中还有大量的范围查询,B+树由于叶子节点是按顺序链接的,所以范围查询上会占绝对优势,综合起来,MySQL适合使用B+树。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值