二叉搜索树(BST)

简明BST递归定义(Knuth Donald):

对于任意一个节点均满足:
1. 所有位于左子树的节点值均比该节点值小
2. 所有位于右子树的节点值均大于等于该节点值
3. 所有左子树和右子树也必须是BST

AVL

简明AVL定义(Knuth Donald):

对于任意一个节点均满足:

1. 左子树和右子树的高度差小于等于1

红黑树

简明RBTREE定义(Knuth Donald):

1. 每个节点要么是红色,要么是黑色
2. 根节点是黑色
3. 所有叶节点(NIL)都是黑色
4. 如果一个节点是红色,那么它的两个孩子都是黑色
5. 从任意一个节点出发,到达其后代NIL节点的路径中都包含相同个数的黑节点

B+树

定义Branch Factor: b 为一个节点可以拥有的最大子节点的个数,那么:

1. 对于根节点,如果整棵树的节点个数大于1,那么根节点的子节点数量大于等于2
2. 对于内部节点,其子节点个数m必须满足 b/2 <= m <= b
3. 对于叶节点,其子节点个数m必须满足 b/2 <= m <= b
4. 每个节点内部的key值是已经排序的
5. 叶节点之间以linked list方式相连并且是有序的
6. 从根节点到叶节点的路径长度均相同

推荐阅读

BST: https://en.wikipedia.org/wiki/Binary_search_tree
AVL: https://en.wikipedia.org/wiki/AVL_tree
RBTREE: https://en.wikipedia.org/wiki/Red%E2%80%93black_tree
B+TREE: https://en.wikipedia.org/wiki/B%2B_tree

树的特性

基于上面对各种树的定义,我们可以推出它们的一些相关特性,本节我们将会罗列并解析这几种树的一些相关特性。

复杂度

我们先比较一下它的在进行各种操作时的复杂度:

Complexity

上面表格每个单元格显示的是平均复杂度/最差复杂度。我们可以看到除了BST外,其他树在查找,插入和删除操作时的复杂度均为O(logn),因为它们都是平衡树,而BST不是。相同的渐近复杂度并不意味着它们毫无区别,毕竟它们可能会相差数倍的关系。接下来我们会描述这些树的一些具体特性,并突出它们的主要区别。

树的应用

BST

通常情况下非平衡的BST都仅仅当作一种概念,很少有实际场景会使用这种结构,因为查找在最差的情况下会出现O(n)的时间复杂度。虽然如此,我们依然可以了解一下它能够实现点什么,即使我们实际应用不会这么做。

BST可以实现:

  • 排序
  • 优先队列

BST排序的实现是把输入的元素一个个插入到BST,然后进行一次中序遍历,平均复杂度为O(nlogn)。优先队列(min)的实现是从根节点出发一直向左找到到最小节点,平均复杂度为O(logn),最差状况为O(n),显然它在时间复杂度上是比不上min-heap的。

AVL

AVL是历史上出现的第一种平衡二叉树,它现在的很多应用都已经被红黑树代替。主要原因是它的平衡限制比较红黑树严格,在插入或者删除节点的时候很容易违反平衡限制条件,造成频繁的树结构调整和重新平衡。AVL限制对每个节点左子树和右子树的高度相差不超过一,所以它是高度平衡的二叉树,因而在进行查找的时候效率很高。而红黑树的平衡限制比AVL要弱,甚至左右子树的高度差等于2倍,所以红黑树的查找效率比AVL要低。但是,红黑树不需要频繁重平衡(得益于其宽松的限制条件),所以在插入删除较频繁的环境中红黑树胜出。

红黑树

红黑树虽然定义复杂,但是它的限制条件是相对AVL宽松的。所以在进行插入删除操作的时候出现违反限制条件的状况较少,因而重平衡操作出现的机会比AVL少。基于上述原因,许多需要进行频繁删插操作的场景都使用来红黑树:

  • Linux epoll
  • C++ STL(sert, map)
  • Completely Fair Sheduler

B+树

B+树主要应用于文件系统中,最大的原因是它高度平衡,branch factor较大,这样可以减少磁盘IO。

B+树主流应用:

  • 数据库索引(SQL Server, PostgreSQL, SQLite)
  • 文件系统(NTFS XFS, NSS, JFS)

树的区别

比较AVL与红黑树的优缺点

在前面已经比较过了这两者的优缺点,为了突出它们的区别,特意把上面一段文字复制到本问题下:

AVL是历史上出现的第一种平衡二叉树,它现在的很多应用都已经被红黑树代替。主要原因是它的平衡限制比较红黑树严格,在插入或者删除节点的时候很容易超出平衡限制条件,造成频繁的树结构调整和重新平衡。AVL限制对每个节点左子树和右子树的高度相差不超过一,所以它是高度平衡的二叉树,因而在进行查找的时候效率很高。而红黑树的平衡限制比AVL要弱,甚至左右子树的高度差等于2倍,所以红黑树的查找效率被AVL要低。但是,红黑树不需要频繁重平衡(得益于其宽松的限制条件),所以在插入删除较频繁的环境中红黑树胜出。REF

同时我们看看Knuth对于AVL的评价:

Knuth AVL Tree Comment

为何数据库索引使用B+树而不是红黑树(或其他)

要理解这个问题,我们先分析一下数据库的性质。数据库的数据被分割为多个Page以文件的形式储存在硬盘上的。因此我们每次进行数据库查询其实是在做Disk IO,而Disk IO是时间开销较大的操作(关键!)。而数据库在进行索引lookup的时候每次access一个page都是一次IO。因此我们需要选择一种能够尽量少做Disk IO的数据结构来构建索引。B+树之所以被选中主要是因为它的branch factor较大,树高较小。因而在进行索引搜索的时候需要进行的IO数量也较其他树的数量小,所以是最合适的做索引的数据结构。基于上述原因,在应用场景需要选树的时候我们都会做如下的思考:基于内存操作的我们考虑红黑树,AVL和BST,基于磁盘操作的我们优先考虑B或B+树。REF

我们在这边引用一段Knuth对于B+树的精彩评价来佐证我们的观点:

Knuth B+ Tree Comment

BST AVL 红黑树 B B+树相关推荐

  1. 红黑树、B(+)树、跳表、AVL对比

    在网上学习了一些材料. 这一篇:https://www.zhihu.com/question/30527705 AVL树:最早的平衡二叉树之一.应用相对其他数据结构比较少.windows对进程地址空间 ...

  2. 总结下各种常见树形结构的定义及特点(二叉树、AVL树、红黑树、Trie树、B树、B+树)

    文章目录 前言 一棵普通的树 相关术语 二叉树 二叉树性质 二叉树特例 二叉查找树 AVL树 特点及应用 红黑树 特点 应用 Trie树 特点及应用 B树 定义及特点 应用 B+树 B+树的优势及应用 ...

  3. 数据结构分析:红黑树、B+树

    数据结构分析:红黑树.B+树 前言 常见的数据结构大概分为以下8种,作为一个开发人员,数据结构是内功之一. 本文参考了网络上相关知识,加之自己的理解.简单说明红黑树.B+树的特性. 1. 二叉搜索树( ...

  4. 树 - (二叉查找树,红黑树,B树)- 红黑树

    虽是读书笔记,但是如转载请注明出处 http://segmentfault.com/blog/exploring/ .. 拒绝伸手复制党 关于二叉树的基本知识,可以参见:Java 实现基本数据结构 2 ...

  5. java 二叉树 红黑树_常见数据结构(二)-树(二叉树,红黑树,B树)

    常见数据结构(二)-树(二叉树,红黑树,B树) 标签: algorithms [TOC] 本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自course ...

  6. HashMap底层实现原理,红黑树,B+树,B树的结构原理,volatile关键字,CAS(比较与交换)实现原理

    HashMap底层实现原理,红黑树,B+树,B树的结构原理,volatile关键字,CAS(比较与交换)实现原理 首先HashMap是Map的一个实现类,而Map存储形式是键值对(key,value) ...

  7. 【Mysql索引】二叉树、红黑树、B树、B+树

    [Mysql索引]二叉树.红黑树.B树.B+树 (1)哈希表 (2)二叉树的弊端的演示: (3)红黑树的插入演示: (4)B树的演示 (5)B+树的演示(叶子加指针:支持范围查找) (5.1)借着学习 ...

  8. 哈希表、红黑树、B树、B+树基础

    一.哈希表 也叫散列表,是根据关键码值而直接进行数据访问的数据结构.(把关键码值映射到表中一个位置来访问记录)映射函数叫做散列函数,存放记录的数组叫做散列表. 散列查找过程分为两步: (1)在存储时通 ...

  9. 算法导论习题—二叉搜索树、红黑树、区间树

    算法基础习题-二叉搜索树.红黑树.区间树 1.二叉搜索树: 2.红黑树: 3.区间树: 1.二叉搜索树: 设 T T T是一棵二叉搜索树,其关键字互不相同;设 x x x是一个叶结点, y y y为其 ...

最新文章

  1. linux的根文件系统中的proc文件夹详解
  2. Python操作SQLite3
  3. 2020互联网大厂薪资出炉!来源OfferShow爆料整理
  4. 浅谈大型网络入侵检测建设
  5. JAVA.NET.SOCKETEXCEPTION: TOO MANY OPEN FILES
  6. 【渝粤教育】国家开放大学2018年春季 0025-22T数据结构 参考试题
  7. python学习格式化输出(一)
  8. 如何实现服务器转发客户端消息,socket 怎么实现服务器与客户端不停的互发消息呢?...
  9. 重读经典《Quaternion kinematics for the error-state Kalman filter》
  10. 九、ES6的箭头函数
  11. 阿里云研究员叔同:云原生是企业数字创新的最短路径
  12. Spring Boot 最佳实践(四)模板引擎Thymeleaf集成
  13. i7 网站服务器,i7服务器地址
  14. 小白学习MVC5+EF6遇到的问题一
  15. 大数据之-入门_Hadoop是什么---大数据之hadoop工作笔记0008
  16. 汉字在字库中的偏移地址计算、显示方法
  17. iOS语音转文字实现
  18. 编程语言和开发环境的选择
  19. Sky光遇云野光之翼在哪获得
  20. Android 调用系统相机并加时间水印

热门文章

  1. 重磅直播 | 多传感器标定原理及方案介绍(阿里云AI Lab)
  2. 巴塞罗那自治大学3D视觉课件(免费获取)
  3. CVPR2021|基于分类深度分布网络的单目3D物体检测
  4. 视频|结构光3D相机光机核心技术及3D成像性能分析
  5. webpack 项目使用--创建webpack 项目(1)
  6. mysql的配置文件几个_mysql多实例(多个配置文件方式)
  7. 在线作图|如何绘制一张变量相关图(PCA)
  8. 中科院微生物所王军课题组特别研究助理招聘
  9. 微生物组-宏基因组分析第8期(报名直播课免费参加线下2020.7)
  10. 图之典—可视化图表的词典