二叉搜索树,AVL树,红黑树,B树,B+树对比分析

平衡树

平衡树(Balance Tree,BT) 指的是,任意节点的子树的高度差都小于等于1。

二叉搜索树

在一颗二叉树中,对于树中每个节点如果满足:

  1. 若其左子树存在,则其左子树中每个节点的值都不大于该节点值;
  2. 若其右子树存在,则其右子树中每个节点的值都不小于该节点值。
  3. 任意节点的左、右子树也分别为二叉搜索树。

那么这棵二叉树就是二叉搜索树。二叉搜索树利用二分查找原理来提高搜索性能,它的平均算法复杂度是O(log n)。

但是在一些特殊情况下,比如依次插入一组有序元素,比如依次插入1-6,二叉搜索树如下图所示,已经退化成了一个链表,搜索复杂度为O(n)。

AVL自平衡二叉搜索树 

为了解决普通二叉搜索树的性能退化问题,引入了AVL自平衡二叉搜索树。普通二叉搜索树搜索性能之所以退化,可以认为是它的平衡性被破坏导致的。如果二叉树能尽量保持平衡,也就是说对于树中的任意一个结点,尽量使其左子树上结点的个数和右子树上结点的个数相差不太多。

平衡二叉树是具有以下性质的二叉查找树:对于树中的任意一个结点,都有该结点的左子树的高度与右子树的高度之差的绝对值小于2,最大为1。与普通的BST相比,AVL树只是多定义了旋转操作,使得当左右子树的高度差的绝对值大于或者等于2时,平衡树可以自动地进行树形调整,以重新满足上述性质。

 

AVL树是通过复杂的旋转操作来保持平衡,当插入删除一个节点时,AVL树需要通过旋转来调整树的形态来达到平衡的目的。某一些情况下,当插入删除一个节点时可能要旋转多次,这会导致 AVL树插入删除节点的性能较低。也就是说AVL树是牺牲了插入删除的性能来提高搜索性能。假设一种使用场景,插入删除次数比较多而搜索次数较少,这时候就不适合使用AVL树。这时候就要引入另一种二叉搜索树,红黑树。实际上,在实际运用中红黑树出现的频率会比AVL多。

红黑树 

红黑树是满足这几种要求的二叉搜索树:

  1. 节点是红色或黑色。
  2. 根节点是黑色。
  3. 所有叶子都是黑色。(叶子是NIL节点) 
  4.  每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
  5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。 

下面两张图分别是依次插入1-6,和1-15的红黑树,对比AVL树的情况明显看出红黑树的平衡性不及AVL树。同时红黑树对平衡性的要求没有AVL树那么高,红黑树最高子树高度不会超过最低子树的2倍。

红黑树的搜索性能略逊于AVL,但是插入删除性能会优于AVL,所以综合来讲红黑树综合性能更高,应用更广。

 

 

B树 

上面提到的都是二叉树,而B树是一棵多叉树。B树和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树(查找路径不只两个),数据库索引技术里大量使用者B树和B+树的数据结构。

AVL树和红黑树等已经拥有了足够的综合性能,但是仅限于内存数据结构。假如数据不是保存在内存中而是保存在磁盘中情况又会怎么样呢?以红黑树为例,它的搜索复杂度是O(log n),这在内存中没有问题,因为内存读取数据比较快,如果是在磁盘中,那就意味着要平均访问磁盘log n次,而磁盘访问速度相对较慢,这是不能接受的。可以简单的理解,因为红黑树的节点只能有两个子树,所以会比较高,如果允许节点有多个子树,那么树的高度就会变小,就可以减少访问磁盘的次数来提高磁盘io性能。

B 树是为了磁盘或其它存储设备而设计的一种多叉平衡查找树。

一棵m阶B树(balanced tree of order m)是一棵平衡的m路搜索树。它或者是空树,或者是满足下列性质的树:

  1. 根节点至少有两个子女;
  2. 每个非根节点所包含的关键字个数 j 满足:m/2 - 1 <= j <= m - 1;
  3. 除根节点以外的所有节点(不包括叶子结点)的度数正好是关键字总数加1,故内部子树个数 k 满足:m/2 <= k <= m ;
  4. 所有的叶子节点都位于同一层。

在B-树中,每个结点中关键字从小到大排列,并且当该结点的孩子是非叶子结点时,该k-1个关键字正好是k个孩子包含的关键字的值域的分划。

下图所示是一棵5阶的B树,插入1-15时高度是2,而红黑树是6,AVL树是4。在实际应用中的B树的阶数m都非常大(通常大于100),所以即使存储大量的数据,B树的高度仍然比较小,所以在磁盘数据结构中相对二叉搜索树有无与伦比的优势。

上图只是一个示意图,在实际运用中,B树节点除了保存关键字(索引)还会保存数据,如下图所示。一个节点的大小通常是一个磁盘块的大小,通常是4k(页框大小)的整数倍。由于B树节点保存有数据,假设数据比较大的时候保存关键字的数量就会变小,最后导致树的高度变大,磁盘访问次数变多,就会影响磁盘io性能。所以就引申出了B+树。

 

B+树 

B+树有以下的要求:

  1. B+树包含2种类型的结点:内部结点(也称索引结点)和叶子结点。根结点本身即可以是内部结点,也可以是叶子结点。根结点的关键字个数最少可以只有1个。
  2. B+树与B树最大的不同是内部结点不保存数据,只用于索引,所有数据(或者说记录)都保存在叶子结点中。
  3. m阶B+树表示了内部结点最多有m-1个关键字(或者说内部结点最多有m个子树),阶数m同时限制了叶子结点最多存储m-1个记录。
  4. 内部结点中的key都按照从小到大的顺序排列,对于内部结点中的一个key,左树中的所有key都小于它,右子树中的key都大于等于它。叶子结点中的记录也按照key的大小排列。
  5. 每个叶子结点都存有相邻叶子结点的指针,叶子结点本身依关键字的大小自小而大顺序链接。
  6.  

由于B+树非叶子节点不保存数据,所以同等条件下它的树高度会较B树小,磁盘io性能更高。

B+树还有个特点是叶子节点之间是通过双向指针串联在一起的,这样对于范围操作会比B树效率高。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值