B树/B+树/二叉搜索树/AVL树/红黑树

B树

概念

B树也称B-树,它是一颗多路平衡查找树。

  • 每个节点最多有m-1个关键字(可以存有的键值对)。
  • 根节点最少可以只有1个关键字
  • 非根节点至少有m/2个关键字
  • 每个节点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。
  • 所有叶子节点都位于同一层,或者说根节点到每个叶子节点的长度都相同。
  • 每个节点都存有索引和数据,也就是对应的key和value。

1. 根节点的关键字数量范围: 1 <= k <= m-1,非根节点的关键字数量范围: m/2 <= k <= m-1

2. 描述一颗B树时需要指定它的阶数,阶数表示了一个节点最多有多少个孩子节点,一般用字母m表示阶数

插入

判断当前结点key的个数是否小于等于m-1,如果满足,直接插入即可,如果不满足,将节点的中间的key将这个节点分为左右两部分,中间的节点放到父节点中即可

删除

1. 删除叶子节点的元素,如果删除之后,节点数还是大于 m/2,这种情况只要直接删除即可

2. 删除叶子节点,如果删除元素后元素个数少于(m/2),并且它的兄弟节点的元素大于(m/2),也就是说兄弟节点的元素比最少值m/2还多,将先将父节点的元素移到该节点,然后将兄弟节点的元素再移动到父节点。

扫描二维码关注公众号,回复: 10566859 查看本文章

3. 删除叶子节点,删除后不满足要求,所以,我们需要考虑向兄弟节点借元素,但是,兄弟节点也没有多的节点(2个),借不了,怎么办呢?如果遇到这种情况,首先,还是将先将父节点的元素移到该节点,然后,将当前节点及它的兄弟节点中的key合并,形成一个新的节点

4. 对于非叶子节点的删除,我们需要用后继key(元素)覆盖要删除的key,然后在后继key所在的子支中删除该后继key

B+树

概念

B+树其实和B树是非常相似

相同点

  • 根节点至少一个元素
  • 非根节点元素范围:m/2 <= k <= m-1

不同点

  • B+树有两种类型的节点:内部结点(也称索引结点)和叶子结点。内部节点就是非叶子节点,内部节点不存储数据,只存储索引,数据都存储在叶子节点
  • 内部结点中的key都按照从小到大的顺序排列,对于内部结点中的一个key,左树中的所有key都小于它,右子树中的key都大于等于它。叶子结点中的记录也按照key的大小排列
  • 每个叶子结点都存有相邻叶子结点的指针,叶子结点本身依关键字的大小自小而大顺序链接
  • 父节点存有右孩子的第一个元素的索引

插入

当节点元素数量大于m-1的时候,按中间元素分裂成左右两部分,中间元素分裂到父节点当做索引存储,但是,本身中间元素还是分裂右边这一部分的

删除

叶子节点有指针的存在,向兄弟节点借元素时,不需要通过父节点了,而是可以直接通过兄弟节移动即可(前提是兄弟节点的元素大于m/2),然后更新父节点的索引;如果兄弟节点的元素不大于m/2(兄弟节点也没有多余的元素),则将当前节点和兄弟节点合并,并且删除父节点中的key

B树/B+树对比

  • 单一节点存储的元素更多,使得查询的IO次数更少,所以也就使得它更适合做为数据库MySQL的底层数据结构了
  • 所有的查询都要查找到叶子节点,查询性能是稳定的,而B树,每个节点都可以查找到数据,所以不稳定
  • 所有的叶子节点形成了一个有序链表,更加便于查找

为什么B+Tree更适合做文件索引

  • 因为B+ Tree的内部节点并没有指向关键字具体信息的指针,所以他的内部节点比其他结构的更小,同样大小的盘块能够容纳更多的单位索引结构,一次性读入内存的关键字信息索引就更多,相对来说IO读写次数也就少很多

为什么不用AVL树或者红黑树做索引

空闲消费高,时间消费高

二叉搜索树

  • 所有非叶子结点至多拥有两个儿子(Left和Right)
  • 所有结点存储一个关键字
  • 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树

AVL树

  • 一个节点的左右子树的高度差不大于1
  • 一个节点的左右子树都是平衡二叉树
  • 平衡二叉树满足二叉树所有的特点

红黑树

  • 每个结点或者为黑或者是红色
  • 红黑树的根节点一定是黑色的
  • 红色的结点的子节点一定是黑色结点
  • 所有的叶子结点一定是黑色的
  • 每一条从根节点到叶子结点的路径上的黑色结点是相等的

AVL树与红黑树对比

  • 如果插入一个结点引起了树的不平衡,AVL树和红黑树都最多2次旋转就可以使其平衡;在删除一个结点引起树的不平衡,最坏情况下,AVL树要从最深的不平衡结点来调整到这条路径上的所有结点的平衡性,因此需要若干次的旋转,而红黑树最多需要三次
  • AVL树是高度平衡的二叉搜索树,所以AVL的查找速率更快一点,红黑树的查找速率会稍微比AVL树慢一点,因为它没有AVL树那样的高度平衡,它比AVL树稍微不平衡多一层,所以查找的时候最多会多一次的比较
  • AVL树在大量数据的插入和删除时,AVL树调整的次数会比红黑树调整的次数多,所以红黑树在插入和删除的大量结点的场景下效率会更高

猜你喜欢

转载自www.cnblogs.com/byene/p/12653443.html