【数据结构】二叉排序树,AVL树,B,B+树总结

声明:本文根据另外一篇博文总结再排版而得,我没有画图。。。
http://blog.csdn.net/whoamiyang/article/details/51926985

二叉排序树

简介:
二叉排序树是对普通二叉树的基础上对根、左、右结点做了关键字大小上的限制。

优点
在查找时可根据左右子节点与根节点的大小关系进行,减少顺序查找的时间复杂度。

缺点:
由于一个排序序列转化成一颗二叉排序树,有多种形式。因此,在某些情况下,二叉排序树的查找时间复杂度不可估量,在最坏的情况下,退化成顺序查找的情况。

AVL树

简介:
AVL树是在二叉排序树的基础上增加了平衡因子的概念,对每一个结点的左右子树的高度进行了限制。

优点:
在建树的过程中保证了树的高度尽可能的低,因此提高查找的效率。

缺点:
在增加和删除结点的时候,要考虑树的平衡情况。当出现某个结点不平衡的情况,就要对首先不平衡的结点进行调整旋转的情况。因此,增加了维护树的开销。

适用场景:
相对于一般的二叉排序树来说,查找速度更快。但是新增和删除结点的 代价比较大。有的时候,比节省的速度代价更大,因此,适用于结点多少比较固定,需要较快查询速度的情况。

红黑树

简介:
红黑树也是一种二叉排序树,相对于AVL树,红黑树是一种弱平衡树(相同结点数的情况下,AVL树的高度不高于红黑树)。为树中的每个结点增加颜色的属性

  • 每个结点的颜色要么为红色,要么为黑色
  • 根结点的颜色为黑色,每个叶节点都是黑色
  • 如果一个节点是红色,那么它的两儿子都是黑色
  • 对于任意结点而言,其到叶子点树NIL指针的每条路径都包含相同数目的黑色结点

优点:
相对于要求严格的AVL树来说,在插入和删除结点元素时,它的旋转次数变少,所以对于搜索,插入,删除操作多的情况下,适用红黑树

应用:

  • 广泛用于C++的STL中,map和set都是用红黑树实现的

  • 著名的linux进程调度Completely Fair Scheduler,用红黑树管理进程控制块,进程的虚拟内存区域都存储在一颗红黑树上,每个虚拟地址区域都对应红黑树的一个节点,左指针指向相邻的地址虚拟存储区域,右指针指向相邻的高地址虚拟地址空间

  • IO多路复用epoll的实现采用红黑树组织管理sockfd,以支持快速的增删改查.

  • Ngnix中,用红黑树管理timer,因为红黑树是有序的,可以很快的得到距离当前最小的定时器

  • java中TreeMap的实现.

B树

B-树就是B树,B树和B+树是为了磁盘或其它存储设备而设计的一种平衡多路查找树(多路,平衡)。与红黑树相比,在相同的的结点的情况下,一颗B/B+树的高度远远小于红黑树的高度

B/B+树上操作的时间通常由存取磁盘的时间和CPU计算时间这两部分构成,而CPU的速度非常快,所以B树的操作效率取决于访问磁盘的次数,关键字总数相同的情况下B树的高度越小,磁盘I/O所花的时间越少.

性质:

  • 定义任意非叶子结点最多只有M个儿子,且M>2
  • 根结点的儿子数为[2, M]
  • 除根结点以外的非叶子结点的儿子数为[M/2, M]
  • 每个结点存放至少M/2-1(取上整)和至多M-1个关键字(至少2个关键字)
  • 非叶子结点的关键字个数 = 指向儿子的指针个数 – 1
  • 非叶子结点的关键字:K[1],K[2], …, K[M-1],且K[i] < K[i+1]
  • 非叶子结点的指针:P[1], P[2],…, P[M],其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1],K[i])的子树
  • 所有叶子结点位于同一层

B+树

B+树是应文件系统所需而产生的一种B树的变形树(文件的目录一级一级索引,只有最底层的叶子节点(文件)保存数据.),非叶子节点只保存索引,不保存实际的数据,数据都保存在叶子节点中。

例如:有3个文件夹a,b,c。 a包含b,b包含c,c中一个文件yang.c, a,b,c就是索引(存储在非叶子节点)。a,b,c只是要找到的yang.c的key,而实际的数据yang.c存储在叶子节点上.

所有的非叶子节点都可以看成索引部分

性质:

  • 非叶子节点的子树指针与关键字个数相同

  • 非叶子节点的子树指针p[i],指向关键字值属于[k[i],k[i+1]]的子树。(B树是开区间,也就是说B树不允许关键字重复,B+树允许重复)

  • 为所有叶子节点增加一个链指针,所有关键字都在叶子节点出现(稠密索引)。且链表中的关键字恰好是有序的)

  • 非叶子节点相当于是叶子节点的索引(稀疏索引),叶子节点相当于是存储(关键字)数据的数据层

  • 更适合于文件系统

应用:
B/B+树主要应用文件系统和数据库做索引

B/B+树性能分析 

n个节点的平衡二叉树的高度为H(即logn),而n个节点的B/B+树的高度为logt((n+1)/2)+1
 

B/B+树性能分析 

n个节点的平衡二叉树的高度为H(即logn),而n个节点的B/B+树的高度为logt((n+1)/2)+1
 

若要作为内存中的查找表,B树却不一定比平衡二叉树好,尤其当m较大时更是如此.因为查找操作CPU的时间在B-树上是O(mlogtn)=O(lgn(m/lgt)),而m/lgt>1;所以m较大时O(mlogtn)比平衡二叉树的操作时间大得多. 因此在内存中使用B树必须取较小的m.(通常取最小值m=3,此时B-树中每个内部结点可以有2或3个孩子,这种3阶的B-树称为2-3树)

为什么说B+tree比B树更适合实际应用中操作系统的文件索引和数据索引?

B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了

由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

引自知乎:

B树在提高了IO性能的同时并没有解决元素遍历的效率低下的问题,正是为了解决这个问题,B+树应用而生.B+树只需要去遍历叶子节点就可以实现整棵树的遍历.而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作(或者说效率太低).  

    原文作者:B树
    原文地址: https://blog.csdn.net/mengaliu_123/article/details/52649512
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞