BST AVL 红黑树 B B+树
二叉搜索树(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+树相关推荐
- 红黑树、B(+)树、跳表、AVL对比
在网上学习了一些材料. 这一篇:https://www.zhihu.com/question/30527705 AVL树:最早的平衡二叉树之一.应用相对其他数据结构比较少.windows对进程地址空间 ...
- 总结下各种常见树形结构的定义及特点(二叉树、AVL树、红黑树、Trie树、B树、B+树)
文章目录 前言 一棵普通的树 相关术语 二叉树 二叉树性质 二叉树特例 二叉查找树 AVL树 特点及应用 红黑树 特点 应用 Trie树 特点及应用 B树 定义及特点 应用 B+树 B+树的优势及应用 ...
- 数据结构分析:红黑树、B+树
数据结构分析:红黑树.B+树 前言 常见的数据结构大概分为以下8种,作为一个开发人员,数据结构是内功之一. 本文参考了网络上相关知识,加之自己的理解.简单说明红黑树.B+树的特性. 1. 二叉搜索树( ...
- 树 - (二叉查找树,红黑树,B树)- 红黑树
虽是读书笔记,但是如转载请注明出处 http://segmentfault.com/blog/exploring/ .. 拒绝伸手复制党 关于二叉树的基本知识,可以参见:Java 实现基本数据结构 2 ...
- java 二叉树 红黑树_常见数据结构(二)-树(二叉树,红黑树,B树)
常见数据结构(二)-树(二叉树,红黑树,B树) 标签: algorithms [TOC] 本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自course ...
- HashMap底层实现原理,红黑树,B+树,B树的结构原理,volatile关键字,CAS(比较与交换)实现原理
HashMap底层实现原理,红黑树,B+树,B树的结构原理,volatile关键字,CAS(比较与交换)实现原理 首先HashMap是Map的一个实现类,而Map存储形式是键值对(key,value) ...
- 【Mysql索引】二叉树、红黑树、B树、B+树
[Mysql索引]二叉树.红黑树.B树.B+树 (1)哈希表 (2)二叉树的弊端的演示: (3)红黑树的插入演示: (4)B树的演示 (5)B+树的演示(叶子加指针:支持范围查找) (5.1)借着学习 ...
- 哈希表、红黑树、B树、B+树基础
一.哈希表 也叫散列表,是根据关键码值而直接进行数据访问的数据结构.(把关键码值映射到表中一个位置来访问记录)映射函数叫做散列函数,存放记录的数组叫做散列表. 散列查找过程分为两步: (1)在存储时通 ...
- 算法导论习题—二叉搜索树、红黑树、区间树
算法基础习题-二叉搜索树.红黑树.区间树 1.二叉搜索树: 2.红黑树: 3.区间树: 1.二叉搜索树: 设 T T T是一棵二叉搜索树,其关键字互不相同;设 x x x是一个叶结点, y y y为其 ...
最新文章
- linux的根文件系统中的proc文件夹详解
- Python操作SQLite3
- 2020互联网大厂薪资出炉!来源OfferShow爆料整理
- 浅谈大型网络入侵检测建设
- JAVA.NET.SOCKETEXCEPTION: TOO MANY OPEN FILES
- 【渝粤教育】国家开放大学2018年春季 0025-22T数据结构 参考试题
- python学习格式化输出(一)
- 如何实现服务器转发客户端消息,socket 怎么实现服务器与客户端不停的互发消息呢?...
- 重读经典《Quaternion kinematics for the error-state Kalman filter》
- 九、ES6的箭头函数
- 阿里云研究员叔同:云原生是企业数字创新的最短路径
- Spring Boot 最佳实践(四)模板引擎Thymeleaf集成
- i7 网站服务器,i7服务器地址
- 小白学习MVC5+EF6遇到的问题一
- 大数据之-入门_Hadoop是什么---大数据之hadoop工作笔记0008
- 汉字在字库中的偏移地址计算、显示方法
- iOS语音转文字实现
- 编程语言和开发环境的选择
- Sky光遇云野光之翼在哪获得
- Android 调用系统相机并加时间水印
热门文章
- 重磅直播 | 多传感器标定原理及方案介绍(阿里云AI Lab)
- 巴塞罗那自治大学3D视觉课件(免费获取)
- CVPR2021|基于分类深度分布网络的单目3D物体检测
- 视频|结构光3D相机光机核心技术及3D成像性能分析
- webpack 项目使用--创建webpack 项目(1)
- mysql的配置文件几个_mysql多实例(多个配置文件方式)
- 在线作图|如何绘制一张变量相关图(PCA)
- 中科院微生物所王军课题组特别研究助理招聘
- 微生物组-宏基因组分析第8期(报名直播课免费参加线下2020.7)
- 图之典—可视化图表的词典